TestNG - 如何在 testng 自定义电子邮件报告中打印运行时 testng 参数?

Posted

技术标签:

【中文标题】TestNG - 如何在 testng 自定义电子邮件报告中打印运行时 testng 参数?【英文标题】:TestNG - How to print run time testng parameters in testng custom emailable report? 【发布时间】:2019-12-27 10:35:36 【问题描述】:

我发现有一个选项可以通过surefire插件将参数设置为testng xml,然后可以从命令行发送参数。

<plugins>
    [...]
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>3.0.0-M3</version>
        <configuration>
          <systemPropertyVariables>
            <browser>firefox</browser>
          </systemPropertyVariables>
        </configuration>
      </plugin>
    [...]
</plugins>

参考: https://maven.apache.org/surefire/maven-surefire-plugin/examples/testng.html https://maven.apache.org/surefire/maven-surefire-plugin/examples/system-properties.html

需要在 testng 自定义电子邮件报告中打印参数。能够使用以下代码打印 testng xml 中指定的 testng 参数。但是,无法打印surefire插件中指定的参数。

注意:System.getProperty("browser") 在这里工作。但是,我想打印它们而不必指定参数名称(比如“浏览器”),如下所示。但低于一个不起作用。

Map<String, String> allParameters = context.getCurrentXmlTest().getAllParameters();
for(String parameter: allParameters.keySet()) 
    System.out.println(parameter + " : " + allParameters.get(parameter));

例子:

import java.util.Map;
import org.testng.ITestContext;
import org.testng.ITestResult;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class TestNGTest 
    ITestContext context;

    @BeforeTest
    public void beforeTest(ITestContext context) 
        this.context = context;
    

    @Parameters("browser")
    @Test
    public void method(String browser) 
        System.out.println(browser);
        Map<String, String> allParameters = context.getCurrentXmlTest().getAllParameters();
        for(String parameter: allParameters.keySet()) 
            System.out.println(parameter + " : " + allParameters.get(parameter));
        
    

实际输出:

[RemoteTestNG] detected TestNG version 7.0.0
chrome
key : value

===============================================
Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================

预期输出:

[RemoteTestNG] detected TestNG version 7.0.0
chrome
key : value
browser : chrome

===============================================
Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================

Testng.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" parallel="classes" thread-count="4">
    <test name="Front-End" group-by-instances="true">
    <parameter name="key" value="value"></parameter>
        <classes>
            <class name="com.ftd.automation.framework.tests.TestNGTest" />
        </classes>
    </test>
</suite>

请帮助我如何打印在surefire插件中指定或在命令行中传递的testng参数。

【问题讨论】:

【参考方案1】:

假设您使用命令行参数运行,例如,

mvn test -Dbrowser=firefox

然后获取参数,

import org.testng.annotations.Parameters;

@Parameters("browser")
@Test
public void myTestMethod(String browser)
    System.out.println(browser); 


//or as Test parameter
@Test(parameters = "browser")
public void myTestMethod(String browser)
    System.out.println(browser);


//or System.getProperty() way
@Test
public void myTestMethod()
    System.out.println(System.getProperty("browser"));

上面的效果很好。另外,如果需要使用testng.xml,可以指定suiteXmlFilelike,

<plugin>
 <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M3</version>
    <configuration>
      <systemPropertyVariables>
          <browser>firefox</browser>
      </systemPropertyVariables>
      <suiteXmlFiles> 
          <suiteXmlFile>testng.xml</suiteXmlFile>
      </suiteXmlFiles>
     </configuration>
</plugin>

编辑:

仅供参考,System.grtProperties() 列出了所有属性,从命令行设置的属性将在那里,但无法将它们与系统添加的其他属性区分开来

【讨论】:

我想打印参数列表(键值对)而不指定参数名称(即键),如下所示。 Map allParameters = context.getCurrentXmlTest().getAllParameters(); for(String parameter: allParameters.keySet()) System.out.println(parameter + " : " + allParameters.get(parameter)); @SandeepNalla 我不确定如何在没有密钥的情况下获取参数。我相信您需要指定键来检索值。 @Parameters( "param-name" ) 正在等待密钥。另一种选择是使用System.getProperties(),但这会获取系统上的 JVM 从操作系统获取的当前属性。当前的系统属性作为属性对象返回,供getProperties() 方法使用。如果不存在这样的一组属性,则首先创建一组系统,然后对其进行初始化。

以上是关于TestNG - 如何在 testng 自定义电子邮件报告中打印运行时 testng 参数?的主要内容,如果未能解决你的问题,请参考以下文章

TestNG 报告中的自定义测试方法名称

TestNG+Factory,自定义方法的执行顺序

如何从不同的可发送电子邮件的 html 文件构建单个 testNG 可发送电子邮件的报告

testng自定义模板第二版

TestNG 电子邮件报告 - PKIX 路径构建异常

TestNG中测试的执行顺序