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

时间:2019-05-22 08:08:53

标签: spring spring-boot automated-tests integration-testing junit5

配置: zerocode-tdd.1.3.2

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

问题/我需要什么: 在单元测试时,未设置系统属性,并且未解析主机。 App使用Junit和Zerocode,想简单地配置Zerocode来设置系统属性。

示例:

host.properties

web.application.endpoint.host:${host}
web.application.endpoint.port=
web.application.endpoint.context=

更多信息: 要求仅用于配置。无法引入新的Java代码或IDE中的条目。

有什么帮助吗?任何想法都值得赞赏。

3 个答案:

答案 0 :(得分:0)

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

第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;
    }
}

步骤2 :在其他步骤之前添加一个步骤,以使用.json文件中已加载的属性。

test.json

{
    "scenarioName": "Test ...",
    "steps": [
         {
            "name": "config",
            "url": "com.test.Config",
            "operation": "readProperties",
            "request": "",
            "assertions": {}
        }
    ]
}

步骤3 :在步骤config中使用已加载的属性

test.json

 {
        "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}
  • 自定义客户

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

答案 1 :(得分:0)

此功能在零码版本1.3.9及更高版本中可用。 请使用${SYSTEM.PROP:host}之类的占位符,例如${SYSTEM.PROPERTY:java.vendor}解析为Oracle CorporationAzul Systems, Inc.

示例链接: https://github.com/authorjapps/zerocode/blob/master/README.md#general-place-holders

答案 2 :(得分:0)

我的问题是您为什么要尝试访问实际的主机/端口?抱歉回答太长,但请耐心等待。我认为有一种更简单的方法可以实现您的尝试。我发现最好从两种方式来考虑零代码的使用,

  1. 实时集成测试(我认为您正在尝试这样做)[意味着这会调用实时端点/服务],或者
  2. 我所说的集成测试(集成测试,但使用模拟端点/服务)。

以这种方式思考它可以让您有机会获得两个不同的指标,

  1. 使用模拟端点/服务时,我的代码的性能/弹性如何,以及
  2. 当使用实时集成测试时,实际生活中的表现如何(由于数据设置/测试设置,预计会比外部负载测试慢一点)。 这让您可以评估自己和合作伙伴的服务。

那么除了上面的评估之外,您为什么要构建集成测试?这样做的真正价值在于,您仍然可以像在集成测试中一样一直通过代码进行测试,但您可以像在标准单元测试中一样控制所述测试的结果。此外,由于您控制测试结果,因此与实时 API 相比,这可能会提高构建时间测试的稳定性。

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

要设置集成测试,您确实有两种选择,

  1. 使用邮递员模拟服务器(https://learning.postman.com/docs/designing-and-developing-your-api/mocking-data/setting-up-mock/

    一个。更多设置工作

    B.要维护的外部配置

    c.每月 api 调用限制

  2. 使用 WireMock (http://wiremock.org/)

    一个。与您的代码共存

    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 测试的

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