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

时间:2019-04-18 01:23:25

标签: karate

我的要求如下:

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

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

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

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

    • def test_data = “” var JavaOutput = Java.type('com.mycompany.JavaFile'); var testData = JavaOutput.propertyName; “””
  2. 现在,我的test-data-details.feature文件中有我的测试数据对象。我将其中包含测试方案的功能文件的“背景”部分称为此.feature文件(callonce)。因此,我可以重试ID,名称等测试数据详细信息。等,然后可以在api请求路径和有效负载中使用。

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

@RunWith(Karate.class)

公共类AccountRunner {

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");
}

}

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

谢谢

2 个答案:

答案 0 :(得分:1)

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

您也可以在karate-config.js中使用karate.callSingle()

在您的karate-config.js

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

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

答案 1 :(得分:0)

所以我实现了以下设计:

我已经在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文件。