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文件:

 




	
	
		
			
				
			
			
				
				
			
		
		
			
		
	
	
		
			
				
			
			
				
				
			
		
		
			
		
	

        新实践基于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中通过实现。这样做具有如下优势:

        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一起测试。另外,当测试出现问题的时候,测试人员需要读testng.xml文件来追踪错误位置。如果在写testng.xml时将标签中include的groups按逻辑先后顺序排列的话,也不会额外增加追踪错误的难度。

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