当前位置: 首页 > 知识库问答 >
问题:

TestNG

韩景胜
2023-03-14

我想要一个testNG/cucumber跑步者

我有一系列非Cucumber测试,使用已经使用TestNG框架编写的测试,我希望其中也包含Cucumber代码。

有人想出聪明的办法吗?

共有3个答案

公西岳
2023-03-14

另一种技术是在实例化runner之前,使用反射实时修改CucumberOptions注释(多亏了几篇老帖子的灵感):

@Parameters({"featurePath"})
@BeforeTest(alwaysRun = true)
public void setUpTest(@Optional("src/main/java/cucumberFeatureFiles/Testcase.feature") String featurePath) throws Exception {   
    Class<?> testClass = this.getClass();
    changeCucumberAnnotation(testClass, "features", new String [] {featurePath});       
    testNGCucumberRunner = new WaltersTestngCucumberRunner(testClass);        
}

private static void changeCucumberAnnotation(Class<?> clazz, String key, Object newValue) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{  
    Annotation options = clazz.getAnnotation(CucumberOptions.class);                   //get the CucumberOptions annotation  
    InvocationHandler proxyHandler = Proxy.getInvocationHandler(options);              //setup handler so we can update Annotation using reflection. Basically creates a proxy for the Cucumber Options class
    Field f = proxyHandler.getClass().getDeclaredField("memberValues");                //the annotaton key/values are stored in the memberValues field
    f.setAccessible(true);                                                             //suppress any access issues when looking at f
    Map<String, Object> memberValues = (Map<String, Object>) f.get(proxyHandler);      //get the key-value map for the proxy
    memberValues.remove(key);                                                          //renove the key entry...don't worry, we'll add it back
    memberValues.put(key,newValue);                                                    //add the new key-value pair. The annotation is now updated.
}//end method
臧欣怿
2023-03-14

这个“设置”代码实现了这一点。它给了我跑步的乐趣。我也会看看另一个提议。

@Parameters({"featurename"})
@BeforeTest(alwaysRun = true)
public void setUpTest(String featureName) throws Exception {
    testNGCucumberRunner = new TestNGCucumberRunner(this.getClass());
    List<CucumberFeature> featureList = testNGCucumberRunner.getFeatures();

    for (CucumberFeature feature : featureList){
        if (featureName.equalsIgnoreCase(feature.getPath())){
            runFeature = feature;
            break;
        }
    }
}
耿珂
2023-03-14

想出了如何将包含特性文件名的自定义cucumber选项发送到运行程序类。这将允许从testng.xml.运行cucumber和非cucumber测试

下面的文本基于“Cumber for Java”一书中的细节。。。

Cucumber检查是否为@CucumberOptions注释提供了任何选项覆盖。从上到下检查以下内容,发现任何一个后停止:

  1. OS环境变量CUCUMBER_OPTIONS
  2. Java系统属性cucumber.options
  3. Java资源包cucumber.propertiescucumber.options属性

重写中找到的值将替换除插件参数之外的任何值。插件参数将被附加。未被覆盖的参数将不受影响。

testng.xml

<suite name="Default suite">    
    <test name="Cucumber Mix">
        <classes>
            <class name="cucumtestng.test.RunAbstractSampleTest"></class>
            <class name="cucumtestng.test.NormalTest"></class>
        </classes>
    </test>
</suite>


@CucumberOptions(features="",glue="cucumtestng.test.stepdefs",snippets=SnippetType.CAMELCASE,
plugin={"pretty", "html:report", "json:reports.json"})
public class RunAbstractSampleTest extends AbstractTestNGCucumberTests {

}


public class NormalTest {
  @Test
  public void f() {
      System.out.println("NORMAL TESTNG CLASS");
  }
}

您还可以使用testng cucumber类,这些类不扩展AbstractTestNgCucumberTests,而是使用composition。。。

 类似资料:
  • 问题内容: 在工作中,我们目前仍在使用JUnit 3运行测试。我们一直在考虑切换到JUnit 4来编写 新的 测试,但是一段时间以来我一直在关注TestNG。大家都对JUnit 4或TestNG有什么经验,对于大量测试似乎更有效?灵活地编写测试对我们也很重要,因为我们的功能测试涵盖广泛的方面,并且需要以多种方式编写才能获得结果。 旧测试不会被重写,因为它们做得很好。我希望在新的测试中看到的是,可以

  • 问题内容: 目前,我正在以这种方式拍摄测试失败的屏幕截图: 我可以将自己的屏幕截图包含在TestNG报告链接或图片中吗?如果是,怎么办? 我在网上发现的只是FEST框架。但是由于我已经在截屏了,所以我不想使用其他框架。 问题答案: 是的,您可以在testng报告中包含指向屏幕截图的链接。 您需要通过使用@Listeners({yourListener.class})注释您的测试类或所有测试类的父级

  • 问题内容: 当要依赖的测试与具有此批注的测试属于同一类时,批注的属性可以正常工作。但是,如果要测试的方法和依赖的方法位于不同的类中,则该方法不起作用。示例如下: 有什么办法可以解决这个限制?一种简单的解决方法是在该调用中创建测试。但这将是过多的重复。 问题答案: 将方法放在中并使用。 建议验证*中的配置,并在该处出现问题时抛出错误,以使测试无法运行。这样,测试可以只关注测试。

  • 问题内容: 我正在尝试使用@BeforeTest来使代码…在每次测试之前运行一次。 这是我的代码: “ BeforeTest”仅打印一次,而不打印两次。我究竟做错了什么? 问题答案: 使用@BeforeMethod,而不是@BeforeTest。 @BeforeTest的含义在文档中进行了说明。

  • 问题内容: 我一直在谷歌搜索几天,试图弄清楚如何做到这一点,如果有人在我非常感谢您帮助之前已经做到了这一点。 我有一个在IntelliJ中创建的自动化测试项目,该项目可以使用户与Web应用程序进行交互的过程自动化。 我想将自动测试(使用Selenium和TestNG在Java中创建)放入可执行的jar文件中,其他人可以通过双击jar文件来运行它。 每当我尝试通过导航到Project Structu

  • 问题内容: 我们刚刚开始在我们的项目上使用Gradle和TestNG,所以我正在检查是否有任何测试失败实际上会使构建失败。我很惊讶地发现事实并非如此。正确地拾取并编译了测试,因此我看到了类文件。我也得到了运行的报告,但是显示0个测试(预期2个)。跑步给我以下内容: SuperSimpleTest.java: build.gradle包含: 我已经看过有关此主题的其他问题,并且找到了用作解决方法的提

  • 问题内容: 我必须在testng中编写以下单元测试用例: saveProductTest如果产品详细信息成功保存在数据库中,则将返回productId。 ModifyProductTest,它应该使用以前保存的productId作为参数。 我正在使用testNg数据提供程序从XML文件中获取saveProductTest的产品详细信息输入(PrdouctName,ReleaseDate)和Modi

  • 问题内容: 我想编写一个TestNG测试,以确保在特定条件下引发了异常,如果未引发异常,则使测试失败。有没有一种简单的方法,而不必创建额外的布尔变量? 有关此主题的相关博客文章:http : //konigsberg.blogspot.com/2007/11/testng-and- expectedexceptions-ive.html 问题答案: 在最常见的情况下很有用: 您期望会引发特定的异常