วันนี้ได้ฤกษ์ทดลอง load มาลองเล่นดู
TestNG ก็คือ Testing Framework
เช่นเดียวกับกับ JUnit นั่นเอง
ส่วนประเด็นที่ต่างกันก็คือ
- TestNG นำ Annotation(jdk1.5)
หรือ javadoc tag(กรณี jdk1.4) เข้ามาใช้
เดิมใน JUnit ตัว testcase จะต้อง extends class TestCase
แต่ใน TestNG เราไม่ต้อง extends หรือ implements อะไรเลย
โดยเราจะเปลี่ยนมาใช้ annotation มาเป็นตัวอธิบาย nature
ของ testcase แทน
ยกตัวอย่างการเขียน test case ด้วย TestNGimport com.beust.testng.annotations.*;
public class SimpleTest {
@Configuration(beforeTestClass = true)
public void init() {
...
}
@Test(groups = {"basic"})
public void testMe() {
.... test go here.
}
}
@Configuration เป็นการบอกให้รู้ว่า method ที่ระบุนั้น
ต้องการให้ run เมื่อไร เช่น run ก่อน test method
หรือ run หลัง test method
กรณีนี้ก็คือ เราบอกให้ run method init ก่อนที่
test method testMe ใน SimpleTest จะ run
@Test เป็นการบอกให้รู้ว่า method ที่ระบุ
เป็น test ที่ต้องการ run
โดย parameter group ช่วยให้เราจัดกลุ่ม
การ test ได้สะดวกขึ้น - การกำหนด test ที่จะ run
TestNG กำหนดสิ่งที่จะ run ผ่าน xml file
ตัวอย่าง<!DOCTYPE suite SYSTEM "http://beust.com/testng/testng-1.0.dtd">
<suite name="run">
<test name="runme">
<classes>
<class name="test.SimpleTest"/>
</classes>
</test>
</suite>
และ run โดยคำสั่งjava com.beust.testng.TestNG testng.xml
- ความสามารถในการจัดกลุ่มการ test
ใน junit เราสามารถจัดกลุ่ม test ได้โดยใช้
suite เข้ามาช่วย แต่ก็มีลักษณะเป็นกลุ่มของ
class
แต่ใน TestNG เราสามารถจัดกลุ่มได้ละเอียด
ถึงขั้น method เลย โดยแต่ละ method สามารถ
กำหนดกลุ่มที่สังกัดได้มากกว่า 1 กลุ่ม
นอกจากนี้ยังสามารถกำหนด กลุ่มของกลุ่ม (group of groups)
,partial groups, exclusion groups ในการ test ได้ - TestNG สามารถกำหนด parameter ให้กับ Test Method ได้
ลองดูตัวอย่าง
@Parameters({"first-name"})
@Test
public void testMatchName(String firstName) {
assert "pphetra".equals(firstName);
}
จากนั้นเราก็ระบุ parameter value ใน xml file<suite name="my suite">
<parameter name="first-name" value="pphetra"/>
<test name="simple>
....
... - การกำหนดลำดับของ test method
ใน testNG สามารถกำหนด dependency ของ test method ได้
เช่น@Test(groups = { "init"})
public void serverStartedOK() {...}
@Test(groups = { "init" })
public void initEnvironment() {...}
@Test(dependsOnGroups = { "init" })
public void method1() {...}
นอกจากกำหนด dependOnGroups ได้แล้ว
ยังกำหนด dependOnMethods ได้อีกด้วย - TestNG สามารถกำหนด Factories เพื่อใช้ในการ
สร้าง TestCase แบบ Dynamic ได้
ความหมายของ Dynamic ก็คือเราสามารถ instantiate
TestCase ขึ้นมาได้หลายๆแบบ ผ่านทาง Factory
class ที่เราเขียนเอง
เช่น
public class TestFactory {
@Factory
public Object[] createInstance() {
Object[] result = new Object[10];
for (int i = 0; i < 10; i++) {
result[i] = new TestCase(i);
}
return result;
}
}
public class TestCase {
private int initValue;
public TestCase(int initValue) {
this.initValue = initValue;
}
@Test
public void testMethod() {
... do test with given initValue
}
}
จากนั้นเมื่อต้องการ run ก็สั่ง run ผ่านทาง TestFactory
เห็นได้ว่าตัว TestNG มี feature ที่น่าสนใจทีเดียว
โดยเฉพาะการกำหนด groups และการกำหนด dependencies
กรณีของผม ถ้าเมื่อไรก็ตามที่เปลี่ยนไปใช้ jdk1.5
ก็คงจะเปลี่ยนจาก JUnit ไปใช้ TestNG แทน
1 comment:
นี่มันยอดไปเลย
Post a Comment