是否可以在testNG中将参数值作为函数名称传递

时间:2019-07-12 12:20:48

标签: java testng optional-parameters

我的s3bucket中存储了一个“ clientId”。该值每天都会从外部设备场运行中进行更新。我想将此//const Person = Object.create(Function); // or const Person = new Function(); const john = Object.create(Person); Function.prototype.foo = 'foo'; console.log(john.foo);作为参数传递给我的测试套件。因为s3内容每天都在更新,所以我在代码中编写了一个函数ClientID。我想将此函数作为ReadFromS3()参数的值。

代替呼叫,

testNG

我想打电话给类似的人

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

使用testNG可以实现吗?如果是这样,请提供指针。

2 个答案:

答案 0 :(得分:0)

是的,您可以做到,但是这会有点令人费解。

这是您的操作方式。

  • 在套件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
===============================================

答案 1 :(得分:0)

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