Automated tests Zerocode:在主机配置文件中设置系统属性

Automated tests Zerocode:在主机配置文件中设置系统属性,automated-tests,integration-testing,junit5,zerocode,Automated Tests,Integration Testing,Junit5,Zerocode,配置: 零码tdd.1.3.2 ${host} 在运行时,使用-D java选项设置系统属性。一切都很好 问题/我需要什么: 在单元测试时,系统属性未设置,主机未解析。 应用程序使用Junit和Zerocode,只需配置Zerocode即可设置系统属性 例如: 主机属性 web.application.endpoint.host:${host} web.application.endpoint.port= web.application.endpoint.context= 更多信息: 要求仅用

配置: 零码tdd.1.3.2

${host} 在运行时,使用-D java选项设置系统属性。一切都很好

问题/我需要什么: 在单元测试时,系统属性未设置,主机未解析。 应用程序使用Junit和Zerocode,只需配置Zerocode即可设置系统属性

例如:

主机属性

web.application.endpoint.host:${host}
web.application.endpoint.port=
web.application.endpoint.context=
更多信息: 要求仅用于配置。无法将新Java代码或条目引入IDE


有人帮忙吗?欢迎提出任何想法。

找到了解决方案,但不确定这是否是正确的方法

步骤1:创建配置文件并加载系统属性

Config.java

public class Config {

    public Map<String, Object> readProperties(String optionalString) {
        Map<String, Object> propertiesMap = new HashMap<>();
        final String host = System.getProperty("host");

        propertiesMap.put("host", host);

        return propertiesMap;
    }
}
步骤3:在步骤配置中使用loaded属性

test.json

{
    "scenarioName": "Test ...",
    "steps": [
         {
            "name": "config",
            "url": "com.test.Config",
            "operation": "readProperties",
            "request": "",
            "assertions": {}
        }
    ]
}
 {
        "scenarioName": "Test ...",
        "steps": [
             {
                "name": "config",
                "url": "com.test.Config",
                "operation": "readProperties",
                "request": "",
                "assertions": {}
            },
            {
                "name": "test",
                "url": "${$.config.response.host}/test/xxx",
                "operation": "GET",
                "request": {},
                "assertions": {
                    "status": 200
                 }
            }
        ]
    }
就是这样,虽然它是有效的,但我正在寻找更好的方法

我正在尝试的一些可能的选择是:

  • 加载/配置的通用步骤(在一个位置)
  • 在json文件中直接使用属性作为{host}
  • 自定义客户端

再次感谢您的帮助/想法。

此功能在zerocode版本
1.3.9
及更高版本中提供。 请使用类似于
${SYSTEM.PROP:host}
的占位符,例如
${SYSTEM.PROPERTY:java.vendor}
解析为
Oracle Corporation
Azul Systems,Inc.

示例链接:
我的问题是,为什么要尝试访问实际的主机/端口?很抱歉回答得太长,但请耐心听我说。我认为有一个更简单的方法来实现你正在尝试的目标。我发现最好从两个方面考虑零代码的使用

  • 实时集成测试(我认为您正试图这么做)[这意味着调用实时端点/服务],或者
  • 我称之为thintegration测试(一种集成测试,但使用模拟端点/服务)
  • 通过这种方式思考,您有机会获得两种不同的指标

  • 使用模拟端点/服务时,我的代码的性能/弹性如何,以及
  • 使用实时集成测试时,实际性能大致如何(由于数据设置/测试设置,预计会比外部负载测试慢一点)。 这可以让您评估您自己和您的合作伙伴服务
  • 那么除了上面的评估之外,您为什么要构建thintegration测试呢?这样做的真正价值在于,您仍然可以像在集成测试中一样在代码中进行测试,但您可以像在标准单元测试中一样控制所述测试的结果。此外,由于您可以控制测试结果,因此与实时api相比,这可能会提高构建时测试的稳定性

    显然,您似乎已经知道如何设置集成测试,所以我假设您很乐意去那里,但是thintegration测试呢

    要设置thintegration测试,您实际上有两个选项

  • 使用postman模拟服务器()

    a。更多的工作要设置

    b。要维护的外部配置

    c。每月api调用限制

  • 使用WireMock()

    a。与你的代码一起生活

    b。都是本地的,所以没有限制

  • 如果您已经有集成测试,您可以将它们复制到新文件并进行更新,或者只转换现有的测试

    ****解决您的具体问题****

    使用WireMock时,可以使用以下命令设置带有动态端口的动态本地服务器url

    protected String urlWithPort;
    
    @Rule
    public WireMockRule wireMockRule = new WireMockRule(wireMockConfig().dynamicPort().dynamicHttpsPort());
    
    protected String getUriWithPort() {
        return "http://localhost:" + wireMockRule.port();
    }
    
    注:以上测试使用WireMock版本2.27.1和ZeroCode 1.3.27

    希望这能帮助您回答如何为测试动态获取服务器/端口