繁体   English   中英

TestNG Automation Framework分别在本地运行测试

[英]TestNG Automation Framework running tests individually, locally

我是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. 不支持并行执行:测试的构建方式,如果我尝试并行运行它们,则整个系统将崩溃,因为从数据源(在您的情况下为属性文件)获取数据的方法取决于类中的非线程安全数据成员。
  2. 正如您已经喊过的,既不能轻松添加新测试,也不能灵活地将它们作为独立测试运行。
  3. 重新测试顺序

为了能够独立运行测试是可以更改您的密钥。 当前,您的密钥依赖于一些int值,该值需要传递给数据源,以便您可以检索其属性。

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

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

添加新测试时,您也不必更改优先级(当然,如果您确实想更改测试的顺序,则需要调整优先级,因为那是优先级。 soft dependency

您甚至可以通过构建org.testng.IAnnotationTransformer的实现来获得更多幻想,在该实现中,您可以基于可读的JVM参数随意启用/禁用@Test方法。 这样就可以让您@Test运行任何@Test方法。 如果您使用maven作为构建工具,那么您实际上不需要变压器,因为maven surefire插件本身就可以做到这一点。

从长远来看,我相信你需要开始寻找dataprovider ,甚至工厂。 您可能还希望摆脱属性的概念,而转而使用诸如JSON / YAML / XML之类的复杂功能,或者只是退回到excel电子表格中,因为在excel电子表格中,您可以通过可视化每个文字来真正地创建完整的RDBMS。表作为一个表,然后让一个表使用键引用另一个表。 然后,您可以开始构建高级的excel数据提供程序,该提供程序能够从电子表格中提取数据并填充POJO(您需要创建一个模型来对电子表格数据行进行建模)。 这就是我们构建SeLion的一部分,最终进行了构建和开放源代码 要了解有关我正在谈论的excel数据提供程序的更多信息,可以在这里引用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM