Friday, June 17, 2005

TestNG

ได้ยินชื่อ TestNG มาระยะหนึ่งแล้ว
วันนี้ได้ฤกษ์ทดลอง 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 ด้วย TestNG
    import 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 แทน

Related link from Roti

1 comment:

bact' said...

นี่มันยอดไปเลย