持续集成:TestNG组织如何测试用例 1
持续集成:TestNG组织如何测试用例
poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标。如果对课程感兴趣,请大家咨询qq:908821478,咨询电话010-84505200。在培训课程中,经常需要写大量的测试用例(Test Case)的例子,然后用TestNG进行自动化测试。随着test case数量的不断增加,发现目前写test case的方法存在一些不足之处。经过几天的思考和探索,找到一种充分利用TestNG的testng.xml配置文件组织test case的方法。
1. 目前组织test case的实践
将所有测试方法放在Common Task的类中,然后根据test case的测试逻辑,创建对应的测试类,然后用TestNG运行这些测试类。
目前实践的实例代码如下:
包含所有测试方法CommonTasks文件:
import java.util.Random; public class CommonTasks { public int method1(int max) { System.out.println("Run method1()"); return new Random().nextInt(max); } public int method2(int max) { System.out.println("Run method2()"); return new Random().nextInt(max); } }
测试类TestCase1:先执行method1,后执行method2
import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class TestCase1 { CommonTasks task; @BeforeClass public void setUp() { task = new CommonTasks(); } @Test @Parameters("max") public void method1(int max) { Assert.assertEquals(task.method1(max), 0, "Failed"); } @Test(dependsOnMethods = "method1") @Parameters("max") public void method2(int max) { Assert.assertEquals(task.method2(max), 0, "Failed"); } }
测试类TestCase2:先执行method2,后执行method1
import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class TestCase2 { CommonTasks task; @BeforeClass public void setUp() { task = new CommonTasks(); } @Test(dependsOnMethods = "method2") @Parameters("max") public void method1(int max) { Assert.assertEquals(task.method1(max), 0, "Failed"); } @Test @Parameters("max") public void method2(int max) { Assert.assertEquals(task.method2(max), 0, "Failed"); } }
测试这两个test case的testng.xml文件:
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite" verbose="1"> <parameter name="max" value="2"></parameter> <test name="testcase1"> <classes> <class name="com.ibm.testng.test.TestCase1"></class> </classes> </test> <test name="testcase2"> <classes> <class name="com.ibm.testng.test.TestCase2"></class> </classes> </test> </suite>
目前组织test case的方法的不足:
1) 随着test case数量的增加,像TestCase1和TestCase2这样的测试类会越来越多。
2)TestCase1这样的测试类,只是根据测试逻辑调用测试方法,并Assert测试方法结果,并无其他功能。测试类间有很多像setUp,Assert这样的重复代码。
3)修改Common Task类和testng.xml都会对测试类产生影响。例如,修改CommonTasks中method1的名称,TestCase1和TestCase2中调用method1()的地方都得修改。修改testng.xml中参数max的名称,需要修改TestCase1和TestCase2中所有用到max变量的地方。
4)dependsOnMethods不被推荐使用。因为,method名称同时作为Java方法名称和字符串,只修改任何一个地方,都会导致方法找不到。