zoukankan      html  css  js  c++  java
  • 持续集成:TestNG组织如何测试用例

    持续集成: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方法名称和字符串,只修改任何一个地方,都会导致方法找不到。

    2. 新的组织test case的实践

            目前的实践方法不仅存在很多重复冗余的代码,而且为以后的重构带来诸多不便。主要原因是测试类介于Common Task类和testng.xml之间,因此,新实践不再为每个test case创建测试类。

            新实践的实例代码如下:

            CommonTasks文件:

    import java.util.Random;
    
    public class NewCommonTasks {
        
        @Test(groups="method1")
        @Parameters("max")
        public void method1(int max) { 
          System.out.println("Run method1()");
          Assert.assertEquals(new Random().nextInt(max), 0, "Failed");
        }  
     
        @Test(groups="method2")
        @Parameters("max")
        public void method2(int max) {  
            System.out.println("Run method2()");
            Assert.assertEquals(new Random().nextInt(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">
    		<groups>
    			<dependencies>
    				<group depends-on="method1" name="method2"></group>
    			</dependencies>
    			<run>
    				<include name="method1"></include>
    				<include name="method2"></include>
    			</run>
    		</groups>
    		<packages>
    			<package name="com.ibm.testng.test.*"></package>
    		</packages>
    	</test>
    	<test name="testcase2">
    		<groups>
    			<dependencies>
    				<group depends-on="method2" name="method1"></group>
    			</dependencies>
    			<run>
    				<include name="method2"></include>
    				<include name="method1"></include>
    			</run>
    		</groups>
    		<packages>
    			<package name="com.ibm.testng.test.*"></package>
    		</packages>
    	</test>
    </suite>

            新实践基于TestNG的一个设计目标:Create a clean separation between thestatic model (the code of your tests) and the runtime model (which tests get run)。这里的static model指Java代码中的测试方法,runtime model指运行时的test case。

            新实践将之前的测试类删掉,将测试类的annotation移到Common Task类中,将测试类的测试逻辑移到testng.xml中通过<dependencies>实现。这样做具有如下优势:

            1)理想情况下,一个Common Task类和一个testng.xml就可以组织出所有test case。不存在代码重复率很高的测试类,class文件数量也不会随着test case数量的增加而增加。

            2)修改Common Task类和testng.xml,相互之间的影响会非常小。修改Common Task类,再也不用去修改大量的测试类。修改testng.xml中的参数名称,也只需要修改Common Task类中很少的地方。

            3)dependsOnGroups代替了dependsOnMethods,任意修改Common Task类中的method名称,都不会有印象。

            当然,这种实现也不是完全没有缺点。例如:测试逻辑也放到testng.xml中后,在test case数量较多的情况下文件会比较长。不过可以根据某些特性将test case放到几个xml配置文件中,然后通过<suite-files>封装成一个suite一起测试。另外,当测试出现问题的时候,测试人员需要读testng.xml文件来追踪错误位置。如果在写testng.xml时将<run>标签中include的groups按逻辑先后顺序排列的话,也不会额外增加追踪错误的难度。

            我们会发现这种实现的testng.xml中,每个test case都需要一个相同的<packages>,其实完全可以把这部分移到<suite>中,使其对所有的test case都有效。不过,这样的尝试没有成功,具体问题描述见testng github,希望知道该问题的人能够指点一下。同时,如果一个test case中要多次以不同参数运行同一group,就会遇到传参和dependency的问题。目前只有一种间接解决方案:将这个test case执行同一group的步骤分配到不同test中,TestNG会按照testng.xml中test的顺序去执行test case。

  • 相关阅读:
    reids 持久化
    center os 下redis安装以及基本使用
    MongoDB安装(Window)
    mysql中文乱码解决办法
    github托管代码
    MySQL表损坏修复【Incorrect key file for table】
    运维杂记-02
    配置ssh秘钥登陆
    nginx解决跨域问题
    运维杂记-01
  • 原文地址:https://www.cnblogs.com/poptest/p/4981464.html
Copyright © 2011-2022 走看看