Karate 为多个要素文件创建公共测试数据

Karate 为多个要素文件创建公共测试数据,karate,Karate,我的要求如下: 我有两个.feature文件。我想创建所有这些功能文件都通用的测试数据。创建测试数据后,将从功能文件运行场景 在创建测试数据之后,我还需要一些信息。例如,我创建的数据的ID。因此,我可以使用此信息调用api,在我的场景中添加有效负载 我认为我们可以通过以下方式做到这一点: 1.创建JUnitJava文件。我用@BeforeClass定义了一个静态方法,并使用Karate的runner()运行我的create-test-data.feature文件(我可以使用Karate点击应用程

我的要求如下:

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

  • 在创建测试数据之后,我还需要一些信息。例如,我创建的数据的ID。因此,我可以使用此信息调用api,在我的场景中添加有效负载

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

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

    • def测试_数据= """ var JavaOutput=Java.type('com.mycompany.JavaFile'); var testData=JavaOutput.propertyName; “”“
  • 现在,我的test-data-details.feature文件中有了测试数据对象。我在功能文件的后台部分调用这个.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");
    }
    
    公共静态对象作业=null;
    @课前
    公共静态无效创建_作业(){
    映射结果=Runner.runFeature(getClass(),“test data.feature”,null,true);
    作业=结果。获取(“作业”);
    }
    
    }

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


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

    您也可以通过使用

    在您的
    karate config.js

    config[“testdata”]=karate.callSingle(“testdata.feature”)


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

    因此,我实现了以下设计:


    我在TestRunner.java文件中创建了两个方法,一个使用BeforeClass,另一个使用AfterClass注释。在这些方法中,我能够调用特定的数据创建和清理功能文件,并将参数作为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);
        }
    
    
    }
    
    @RunWith(空手道类)
    @KarateOptions(标记={“~@ignore”})
    公共类帐户管理器{
    公共静态映射结果=null;
    @课前
    public static void create_job()引发IOException,ParseException{
    clazz类=AccountRunner.Class;
    URL文件_loc=clazz.getResource(“create-test-data-1.json”);
    File File=新文件(File_loc.getFile());
    JSONParser=新的JSONParser();
    objectobj=parser.parse(新文件读取器(文件));
    JSONObject JSONObject=(JSONObject)对象;
    Map args=new HashMap();
    参数put(“有效载荷”,jsonObject);
    结果=Runner.runFeature(CommonFeatures.class,“创建数据.feature”,args,true);
    }
    @下课
    公共静态无效删除_调查(){
    Map args=new HashMap();
    参数put(“有效载荷”,结果);
    Runner.runFeature(CommonFeatures.class,“delete job.feature”,args,true);
    }
    }
    
    为了使用“MVNTest”命令通过命令行运行这些测试,我在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>`
    
    `
    org.apache.maven.plugins
    maven surefire插件
    3.0.0-M3
    **/*Runner.java
    `
    
    有了这个解决方案,我可以通过直接执行运行程序或通过命令行在IDE中运行测试。然而,我还没有找到一种方法来运行我所有的测试,方法是遵循空手道建议的方法,在测试套件级别有一个*Test.java文件,并且使用默认的maven配置和“mvn测试”。在执行运行程序文件之前调用.feature文件时,功能无法运行,运行程序文件具有为测试创建测试数据的方法


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

    好的,这只适用于一组特定的功能文件。我的要求是,我有一组功能,每个功能都有自己的测试数据,对于每一组功能,都有多个功能文件(由api组织)。我想,这种方法会使配置文件过长,对每个特定的“test data.feature”调用callSingle。我想知道一种方法,我们可以使用Java feature runner类来执行此操作,然后所有功能文件都使用它?此外,我需要在运行特定功能(包)下的所有功能文件后删除测试数据(使用单独的功能文件)。我认为这可以通过调用@AfterClass方法中的delete-data.feature并使用空手道跑步器来实现。关于如何克服在静态方法中调用Runner.runFeature()的问题,您可以继续使用上述方法,而不是在karate-config.js中硬编码功能文件路径,将其保存在json(
    testdata.json
    )中,其中key作为测试功能名称,value作为testdata功能名称。使用
    karate.info
    在运行时获取当前功能名称,并使用该名称从
    testdata.json
    中提取要运行的测试数据功能。如上所述,在变量中运行并返回。你不知道