0

作为我测试的先决条件,我需要设置一个大型复杂对象模型,稍后将作为参数发布到特定 API 以便对其进行处理。

模型的值是显示在 FitNesse 页面上的测试输入数据。

模型看起来像:

class FinalEntity extends DoFixture{
    public String field1;
    public String field2;
    // More fields....
    public String field20;
    public ArgumentOneEntity argOne;
    public List<ArgumentTwoEntity> argTwo;
    // More fields....
    //Getters and setters ....

}

class ArgumentOneEntity{
    public String field1;
    public String field2;
    // More fields....
    public List<String> argList = new ArrayList();
    public List<String> argList1 = new ArrayList();

    //Getters and setters ...
}

class ArgumentTwoEntity{
    public String field1;
    public String field2;
    // More fields....
    //Getters and setters ...
}

可以使用桌子,但非常不方便。

使用 FIT 可以执行以下操作:

!define argOne (|field1|value1|
|field2|value2|
|setArgList;|arg1,arg2,arg3|
|setArgList1;|arg4,arg5,arg6|
)

!define argTwo (|field1|value1|
|field2|value2|
)

|FinalEntity |
|setField1;|${argOne}|
|setField2;|${argTwo}|

它会以某种神奇的方式将表格从变量解析为所需的问题。现在的问题是:如何使它与 SLIM 一起工作?

如果这不可能,那么在 SLIM 中构建这样一个对象而不制作一个没有人理解的巨大凌乱表的合理替代方法是什么?

我想到的选项:

  1. 要将测试数据存储在相应 JSON 对象中的文件中,请解析它们并在 FitNesse 页面中显示给业务用户。

我不喜欢它,因为维护这样的测试非常不方便——你需要运行测试或者搜索相应的带有数据的文件。

  1. 为 SLIM 和 FIT 添加依赖项,以便从 SLIM 和 FIT 库中受益。

那没有用 - Fitnesse 服务器根本无法启动。

  1. 用过的桌子 - 这非常痛苦且难以维护。

你对这个问题有什么合理的解决方案吗?

无需说诸如更新模型之类的事情-我不能这样做,或者使用像 JBehave 这样的其他东西-我很乐意这样做,而且我过去对 JBehave 有过积极的体验,但遗憾的是,在这种情况下,我m 不是决定技术和方法的人。

4

1 回答 1

0

我建议将重点放在对 API 的调用上,而不是填充不是您真正想要测试的 POJO 结构。POST 只不过是在 http 调用中发送字符串,因此要编写测试,您需要设置正确的字符串以发送到 API。

正如您提出的问题,您可以通过创建/生成 Java 客户端然后从 wiki 填充其(复杂)模型来进行调用来做到这一点。另一种方法(我推荐,并创建了通用的固定装置来支持)是创建一个正文模板以发布并使用 wiki 填充该模板中的占位符。然后不需要(API)特定的 Java 代码,换句话说,没有 POJO 可以填充。

模板可以完全在 wiki 中,使用 Slim 场景(如果要填充一组固定的占位符),也可以在使用模板引擎填充的单独文件中(如果需要更大的灵活性,例如可选占位符或可变长度列表)。在后一种情况下,为模板引擎提供占位符的数据结构只是一个带有键和值的哈希/映射(而不是带有 getter 和 setter 的 pojo)。在前一种情况下,占位符作为参数提供给场景。

基于场景

使用场景生成两个请求,邮政编码占位符:

!*> Scenario definition
!define POST_BODY_2 { {{{
<s11:Envelope xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/">
  <s11:Body>
    <ns1:GetCityWeatherByZIP xmlns:ns1="http://ws.cdyne.com/WeatherWS/">
      <ns1:ZIP>@{zip}</ns1:ZIP>
    </ns1:GetCityWeatherByZIP>
  </s11:Body>
</s11:Envelope>
}}} }

|script|xml http test|

|scenario |send request _|zip, City                                                       |
|post           |${POST_BODY_2} |to                   |${URL}                        |
|check          |response status|200                                                 |
|show           |response                                                            |
|register prefix|weather        |for namespace        |http://ws.cdyne.com/WeatherWS/|
|check          |xPath          |//weather:City/text()|@{City}                       |
*!

|send request       |
|zip  |City         |
|10007|New York     |
|94102|San Francisco|

使用场景测试输出

自由标记模板

通过使用 Freemarker 模板,我们可以拥有更多动态的正文内容(并且使用 'set value for ' 方法填充占位符)。使用此模板 (samplePost.ftl.xml):

<s11:Envelope xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/">
    <s11:Body>
        <ns1:GetWeather xmlns:ns1="http://www.webserviceX.NET">
            <#if cityName??>
            <ns1:CityName>${cityName}</ns1:CityName>
            </#if>
            <ns1:CountryName>${countryName}</ns1:CountryName>
        </ns1:GetWeather>
    </s11:Body>
</s11:Envelope>

可以创建以下 wiki:

!define GLOBAL_WEATHER_URL {http://www.webservicex.com/globalweather.asmx}
!define GLOBAL_WEATHER_TEMPLATE_NAME {samplePost.ftl.xml}

!3 Don't send a cityName element: error

The Freemarker template will not send a cityName element if no value is supplied (the whole element will be omitted, as can be seen in the request below). The service will not like this.
Omitting the element on a null value could not be done when the body was in the scenario content.

|script          |xml http test                                               |
|template        |${GLOBAL_WEATHER_TEMPLATE_NAME}                             |
|set value       |http://www.webserviceX.NET/GetWeather|for header|SOAPAction |
|set value       |Canada                               |for       |countryName|
|post template to|${GLOBAL_WEATHER_URL}                                       |
|check           |response status                      |500                   |
|show            |request                                                     |
|show            |response                                                    |

!3 Send a cityName element: success

When a cityName value is set the enclosing element is sent by the Freemarker template (as visible in the shown request content below), and the SOAP call will succeed.

|script          |xml http test                                                                   |
|template        |${GLOBAL_WEATHER_TEMPLATE_NAME}                                                 |
|set value       |http://www.webserviceX.NET/GetWeather  |for header   |SOAPAction                |
|set value       |Canada                                 |for          |countryName               |
|set value       |Vancouver International Air-Port, B. C.|for          |cityName                  |
|post template to|${GLOBAL_WEATHER_URL}                                                           |
|check           |response status                        |200                                     |
|show            |request                                                                         |
|show            |response                                                                        |
|register prefix |wsX                                    |for namespace|http://www.webserviceX.NET|
|show            |xPath                                  |!-//wsX:GetWeatherResult/text()-!       |

基于 Freemarker 的测试输出

这两个示例发布 XML,但同样的方法当然也可以用于 JSON API(然后我建议使用'json http test' 夹具,它支持 json 路径而不是 xPath 来对收到的响应进行断言)。

当需要更复杂的占位符(例如可变长度的列表)或者您希望将占位符分组到多个嵌套哈希中(就像您在 POJO 模型中处理嵌套对象一样),这也可以通过使用更详细的键名来实现(例如|set value|someone@example.com|for|email.to[1]|

上面使用的固定装置可以从 GitHub 下载,也可以通过 Maven 使用:

<dependency>
    <groupId>nl.hsac</groupId>
    <artifactId>hsac-fitnesse-fixtures</artifactId>
    <version>2.7.1</version>
</dependency>

您可以尝试这种方法是否适用于您的 API,只需下载项目的“独立 zip”版本、解压缩、运行它,然后更新示例 wiki 页面之一,以使用更新的模板发布到 API 的 URL 并执行页面/测试。

于 2016-08-14T09:06:25.040 回答