TestNG Automation Framework在本地单独运行测试

时间:2017-09-06 22:15:55

标签: java testing automated-tests testng integration

我是TestNG的初学者。我目前在一家公司工作,他们有自己开发的api自动化框架。我习惯于在本地和使用Cucumber时单独运行我的测试用例。但是,在这个框架中,事情紧密耦合在一起。让我简要介绍一下框架的不同方面:

测试数据管理: 通过属性文件读取测试数据。使用每个api模块的键值在属性中列出所有测试用例数据。密钥的编号方式是测试用例类型和附加的计数器。例如:

example.properties

.....
.....
    getTestCase38=TC_ID_38
    getDescription38= Description_38
    getUserID38=<some value>
    getUserType38=<some value>
    expectedUserType38=<some value>

    getTestCase39=TC_ID_39
    getDescription39= Description_39
    getUserID39=<some value>
    getUserType39=<some value>
    expectedUserType39=<some value>

    postTestCase1=TC_ID_1
    postDescription1= Description_1
    postUserID1=<some value>
    postUserType1=<some value>
    expectedUserType1=<some value>
...
...

测试数据流: 从属性文件中读取数据。属性文件映射到TestNG类。 TestNG类中这些方法的命名约定如下:

public class ModuleA extends ModuleACommon{    

int getcount = 0;
int postcount = 0;

    @Test(priority=20)
    public void testMoudleAGetPositive38(){
     callMethodToReadData(getcount++);
     ....
    }   

    @Test(priority=21)
    public void testModuleAGetPositive39(){
     callMethodToReadData(getcount++);
     ....
     ....
    } 
    ......
    ......

    @Test(priority=30)
    public void testModuleAPostPositive1(){
     callMethodToReadData(postcount++);
     ....
     ....
    }   
   ......
   ......
}

请注意,当调用callMethodToReadData时,计数会递增,并用于构建密钥以从属性文件中访问测试数据。测试用例按顺序设置为优先级,这可确保构造正确的密钥。这很痛苦,因为如果我想在这个模式后面添加一个新的测试用例。假设我想添加一个测试用例,并将其优先级分配给21,那么我将不得不调整21之后所有测试方法的优先级,包括第21个优先测试用例。

短期内: 我试图找到一种最简单的方法来单独运行一个测试。有很多方法可以实现这一点。例如,我可以注释掉其他测试用例并重新分配适当的计数值,但这样效率太低。

长期: 从长远来看,我很乐意听取意见和建议来改善这一点。我自己有很多想法可以长期改进,但我希望从这里得到更多有见地的建议。

另外,让我知道是否有任何黑客可以解决添加测试用例的问题而不必重新组织优先级(我已经实现了一个解决方案,我只使用了一个更具描述性的唯一键实际测试用例)。

1 个答案:

答案 0 :(得分:2)

巩固使用此方法可以看到的一些问题:

  1. 不支持并行执行:构建测试的方式,如果我尝试并行运行它们,整个系统将崩溃,因为从数据源获取数据的方法(在您的情况下为属性文件)依赖于类中非线程安全的数据成员。
  2. 正如您已经提到的那样,无法轻松添加新测试,也无法灵活地将它们作为独立测试运行。
  3. 重新排序测试
  4. 为了能够独立运行测试,可以更改密钥。您当前的密钥依赖于某个int值,该值需要传递给数据源,以便您可以检索它的属性。

    我建议您将其更改为开始作为@Test的方法名称。既然你说每个测试类你都会有一个属性文件,因为Java不允许你定义两个具有相同名称的方法(当然,方法重载会让你这样做,但是因为我们讨论的是{{ 1}}方法,我们可以方便地忽略那部分),如果你的密钥取决于方法名称,你的密钥仍然是唯一的。现在您也不需要明确引用方法名称。在@Test方法中,如果您调用了@Test,那么callMethodToReadData()只需调用callMethodToReadData()即可轻松检索当前正在运行的@Test方法名称(请记住,当您从org.testng.Reporter.getCurrentTestResult().getMethod().getMethodName()方法中查询线程局部变量ITestResult时,TestNG确保存在有效的Reporter.getCurrentTestResult对象

    现在,这将使您摆脱对计数器的依赖,从而形成您的密钥。您的属性文件更具可读性,因为该键现在代表方法名称,因此它更清楚地说明数据属于哪种测试方法。

    在添加新测试时,您也不必更改优先级(当然,如果您真的想要更改测试的顺序,则需要调整优先级,因为这是优先级的重点。{{ 1}})

    你甚至可以通过构建@Test的实现来获得更多的幻想,其中你可以根据你可以读取的JVM参数随意启用/禁用soft dependency方法。因此,字面上允许您随意运行任何org.testng.IAnnotationTransformer方法。如果您使用maven作为构建工具,那么您真的不需要变换器,因为maven surefire插件本身可以让您这样做。

    从长远来看,我认为你需要开始关注@Test甚至工厂。您可能还想摆脱属性的概念,转而使用JSON / YAML / XML这样复杂的东西,或者只回到excel电子表格,因为在excel电子表格中,您可以通过可视化每个电子表格开始创建完整的RDBMS。 sheet作为一个表然后有一个表使用键引用另一个表。然后,您可以构建一个复杂的Excel数据提供程序,它能够从电子表格中提取数据并填充POJO(您需要创建一个,为电子表格数据行建模)。这就是我们最终建立和开放采购作为构建SeLion的一部分。要了解有关我正在讨论的Excel数据提供程序的更多信息,请参阅here