为多个功能文件创建通用测试数据



我的要求如下:

  1. 我有几个 .feature 文件。我想创建所有这些功能文件通用的测试数据。创建测试数据后,将从功能文件运行方案。

  2. 我还希望在创建测试数据后返回一些信息。 例如,我创建的数据的 ID。因此,我可以使用此信息来调用 api,在我的方案中添加有效负载。

我认为我们可以通过以下方式做到这一点: 1. 创建一个 junit java 文件。我定义了一个包含@BeforeClass的静态方法,并使用空手道的runner()来运行我的create-test-data.feature文件(我可以使用空手道点击应用程序api来创建一些数据)。我在 Java 类中定义了一个 Object 类型的属性,并使用 Runner.runFeature() 的结果对其进行设置。

  1. 然后我创建一个单独的功能文件 test-data-details.feature。我在这里定义我的 Java 互操作代码。例如,

    • 定义 test_data = """ var JavaOutput = Java.type('com.mycompany.JavaFile'); var testData = JavaOutput.propertyName; """>
  2. 现在,我的测试数据对象已包含在测试数据详细信息功能文件中。我在包含测试方案的功能文件的"背景"部分中调用此 .feature 文件 (callonce)。所以我可以重试测试数据详细信息,如 id、名称。等,然后我可以在 api 请求路径和有效负载中使用。

我不确定上述设计是否是正确的方法。我尝试过,但在我的 Java 文件中遇到了一些问题,下面的 getClass() 抱怨它不能在静态方法中使用。

@RunWith(Karate.class)

公共类帐户运行程序 {

public static Object job = null;
@BeforeClass
public static void create_job(){
Map<String, Object> result = Runner.runFeature(getClass(), "test-data.feature", null, true);
job = result.get("job");
}

}

现在以上所有内容都可能是完全错误的。需要有关如何在空手道中处理这种情况的帮助。

谢谢

从您的问题中,我知道您有一个通用的测试数据特征文件,您希望在所有测试之前运行该文件,并将该响应保存在可用于所有测试功能的变量中。

你也可以在空手道配置中实现这一点.js使用karate.callSingle()

在您的karate-config.js

config["testdata"] = karate.callSingle("test-data.feature")

您的test-data.feature将在所有测试之前执行一次,并将响应存储在testdata您可以直接在功能中使用此变量。

所以我实现了以下设计:

我已经在我的TestRunner.java文件中创建了两个方法,一个使用BeforeClass,另一个使用AfterClass注释。在这些方法中,我能够调用特定的数据创建和清理功能文件,并将 args 作为 Json 对象传递。

@RunWith(Karate.class)
@KarateOptions(tags = {"~@ignore"})
public class AccountRunner {
public static Map<String, Object> result = null;
@BeforeClass
public static void create_job() throws IOException, ParseException {
Class clazz = AccountRunner.class;
URL file_loc = clazz.getResource("create-test-data-1.json");
File file = new File(file_loc.getFile());
JSONParser parser = new JSONParser();
Object obj = parser.parse(new FileReader(file));
JSONObject jsonObject = (JSONObject) obj;
Map<String, Object> args = new HashMap();
args.put("payload", jsonObject);
result = Runner.runFeature(CommonFeatures.class, "create-data.feature", args, true);
}

@AfterClass
public static void delete_investigation() {
Map<String, Object> args = new HashMap();
args.put("payload", result);
Runner.runFeature(CommonFeatures.class, "delete-job.feature", args, true);
}

}

要使用"mvn test"命令通过命令行运行这些测试,我已经在 pom.xml 中进行了以下更改。

`<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0-M3</version>
<configuration>
<includes>
<include>**/*Runner.java</include>
</includes>
</configuration>
</plugin>`

有了这个解决方案,我可以通过直接执行运行器或通过命令行在 IDE 中运行我的测试。但是,我还没有找到一种方法来运行我所有的测试,方法是按照空手道建议的方法运行我所有的测试,我在测试套件级别有一个 *Test.java 文件,并且我使用默认的 maven 配置和"mvn test"。这些功能无法运行,因为在执行 Runner 文件之前调用 .feature 文件,该文件具有为测试创建测试数据的方法。

也许有人可以建议还有什么,我可以使用空手道方法来运行 *Test.java 文件而不是每个 *Runner.java 文件。

最新更新