【问题标题】:Is it possible to pass parameter value as a function name in testNG是否可以在 testNG 中将参数值作为函数名传递
【发布时间】:2019-07-12 12:20:48
【问题描述】:

我的 s3bucket 中存储了一个“clientId”。此值每天从外部设备场运行更新。我想将此ClientID 作为我的测试套件中的参数传递。因为,s3 内容每天都在更新,所以我在代码中编写了一个函数ReadFromS3()。我想将此函数作为 testNG 参数的值。

而不是调用,

 <sysproperty key="clientId" value="abc"/>

我想调用类似下面的东西

<sysproperty key="clientId" value=ReadFromS3()/>

这可以通过 testNG 实现吗?如果有,请指点。

【问题讨论】:

  • 您可以使用 DataProvider 为您的测试提供动态参数(所谓的数据驱动测试)。 Google for 'testNG DataProvider'

标签: java testng optional-parameters


【解决方案1】:

是的,你可以做到,但这将是一个有点复杂的方法。

这就是你的做法。

  • 在您的套件 xml 文件中,您需要传入可调用的方法的完全限定方法名称以获取实际值。
  • 通过参数在@Test 方法中获得方法名称后,您可以使用反射来加载类,找到方法并调用它。

这是一个示例

import java.lang.reflect.Method;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

public class SampleTestClass {

  @Parameters({"clientId"})
  @Test
  public void testMethod(String methodName) throws Exception {
    System.err.println("Value for clientId :" + invokeMethod(methodName));
  }

  private String invokeMethod(String methodName) throws Exception {
    String[] parts = methodName.split("#");
    String className = this.getClass().getName();
    String method = parts[0];
    if (parts.length == 2) {
      className = parts[0];
      method = parts[1];
    }
    Class<?> clazz = Class.forName(className);
    Object object = clazz.newInstance();
    Method m = clazz.getDeclaredMethod(method);
    m.setAccessible(true);
    return m.invoke(object).toString();
  }

  private String readFromS3() {
    return "s3Bucket";
  }
}

套件文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="57006917_Suite" verbose="2">
  <test name="57006917_Test">
    <parameter name="clientId"
      value="com.rationaleemotions.stackoverflow.qn57006917.SampleTestClass#readFromS3"/>
    <classes>
      <class name="com.rationaleemotions.stackoverflow.qn57006917.SampleTestClass"/>
    </classes>
  </test>
</suite>

输出:

...
... TestNG 7.0.0-beta7 by Cédric Beust (cedric@beust.com)
...
Value for clientId :s3Bucket
PASSED: testMethod("com.rationaleemotions.stackoverflow.qn57006917.SampleTestClass#readFromS3")

===============================================
    57006917_Test
    Tests run: 1, Failures: 0, Skips: 0
===============================================

===============================================
57006917_Suite
Total tests run: 1, Passes: 1, Failures: 0, Skips: 0
===============================================

【讨论】:

    【解决方案2】:

    如果存储在我的 s3bucket 中的“clientId”每天都在更新,最好在套件之前读取一次客户端 ID,并将其存储到上下文或系统属性中。您可以为此实现套件侦听器或使用BeforeSuite 创建方法。

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2014-04-15
      • 2020-02-19
      • 2010-12-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多