如何在Fitnesse SLIM中设置复杂的复合pojo对象?

时间:2016-08-12 03:24:33

标签: automated-tests fitnesse fitnesse-slim

作为我的测试的先决条件,我需要设置大型复杂对象模型,稍后将作为参数发布到特定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页面中的业务用户。我不喜欢它。因为维护此类测试非常不方便 - 您需要运行测试或搜索带有数据的相应文件。 2.为SLIM和FIT添加两个依赖项,以便从slim和fixlibrary中受益。这没用 - Fitnesse服务器根本无法启动。 3.使用过的桌子 - 非常痛苦,难以维护。

您对此问题有任何合理的解决方案吗?

不需要说更新你的模型 - 我不能这样做,或者使用像JBehave这样的东西 - 我很乐意这样做,而且我过去对JBehave有积极的经验,但遗憾的是在这种情况下我'我不是那些对技术和方法做出决定的人。

1 个答案:

答案 0 :(得分:0)

我建议关注对API的调用,而不是填充一个不是你想要测试的POJO结构。 POST只是在http调用中发送字符串,因此要编写测试,您需要设置正确的字符串以发送到API。

您可以通过创建/生成Java客户端,然后从wiki填充其(复杂)模型来进行调用,如您所提出的那样。 另一种方法(我建议创建generic fixtures to support)是创建一个主体模板来发布和使用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|

Test output with scenario

自由标记模板

通过使用Freemarker模板,我们可以拥有更多动态的主体内容(并且使用&#39;设置值为&#39;方法填充占位符)。使用此模板(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 based test output

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

当需要更复杂的占位符(例如可变长度列表)或者您希望将占位符分组为多个嵌套哈希(就像在POJO模型中对嵌套对象一样),这也可以通过使用更多精心设计的密钥名称(例如|set value|someone@example.com|for|email.to[1]|

上面使用的灯具可以是downloaded from GitHub,也可以通过Maven使用:

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

您可以尝试通过下载'standalone zip' version of the project,解压缩,运行它然后更新其中一个示例Wiki页面以使用更新的模板发布到您的API的URL并执行此方法是否适用于您的API页面/测试。