2017-03-03 52 views
0

我目前使用IAnnotationTransformer排除其中的名称中包含特定字符串的XML中列出的所有测试,例如:如何获取testMethod调用的所有方法? (Java中,TestNG的,IAnnotationTransformer)

@Override 
@SuppressWarnings("rawtypes") 
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { 
    if(testMethod.getName().contains("StringGoesHere")){ 
      annotation.setEnabled(false); 
     } 

这工作得很好,但是由于我的测试的命名约定以及我需要排除的大量测试,理想的解决方案是找到一种排除测试的方法,如果它调用特定的方法。比如,我要排除的呼吁方法.clickUserSettings()如下所示的所有测试:

@Test 
public void editUserDetailsOnStackOverflow() { 
    final StackOverflow so = stackOverflow.loginAsMe() 
      .clickUserSettings() 
      .changeUserEmail() 
      .clickSave() 
      .assertChangeSuccessful(); 
} 

有谁知道我如何能够实现这一目标?我觉得我已经探索过所有其他途径(类,包,testMethods,groups,xml等),并且必须以这种方式完成这个任务,原因是我目前有40,000个测试(其中15,000个可能会被排除在外由测试仪设置的browserMode变量)这是一般的想法,我希望能实现:

@Override 
@SuppressWarnings("rawtypes") 
public void transform(ITestAnnotation annotation, Class testClass, Constructor testConstructor, Method testMethod) { 
    if(testMethod.getAllCalledMethods.contains(".clickUserSettings()")){ 
      annotation.setEnabled(false); 
     } 

如果可以做到这一点,将解决我的问题,

干杯

+1

为什么群体不适合用途? –

+0

嗯 - 没有什么开箱就会给你。考虑编写一个外部脚本作为预测试或beforesuite运行 - 生成这些方法的列表 - 您可以在注释转换器中禁用这些方法。一些方法:http://stackoverflow.com/questions/930289/how-can-i-find-all-the-methods-that-c​​all-a-given-method-in-java。你可以在文件中做一个grep或者在一个包含测试的快速循环中考虑一些解决方案 –

回答

0

这不是可能与TestNG。 TestNG只能看到注释了其注释的方法,并且不知道TestNG方法在执行过程中所穿过的代码路径。 [在这里,我假设方法clickUserSettings()是一种实用工具方法,你@Test方法也许调入,作为其执行的一部分]

所以,你有两个选择

  1. 诉诸使用群体,其中所有这些方法会调用clickUserSettings()作为特定组的一部分,然后从执行中排除该组。
  2. 创建您自己的自定义注释,注释所有使用此批注调用clickUserSettings()的方法,然后修改当前的AnnotationTransformer以在方法级别或在类级别查找此批注。