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

问题描述 投票:0回答:1

作为我的测试的前提条件,我需要设置一个大的复杂对象模型,稍后将作为特定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有一个积极的体验,但遗憾的是,在这种情况下,我不是那个对技术和方法做出决定的人。

automated-tests fitnesse fitnesse-slim
1个回答
0
投票

我建议把重点放在对API的调用上,而不是填充一个POJO结构,这不是你真正想要测试的东西。POST不过是在http调用中发送一个字符串,所以要写一个测试,你需要设置正确的字符串发送到API。

你可以通过创建一个Java客户端,然后从wiki中填充其(复杂的)模型来进行调用,就像你的问题所建议的那样。支持通用夹具)是创建一个要发布的正文模板,并使用wiki在该模板中填充占位符。然后不需要(API)特定的Java代码,换句话说,不会有POJO来填充。

模板可以完全放在wiki中,使用Slim方案(如果有一组固定的占位符需要填充),或者放在一个单独的文件中,使用模板引擎来填充(如果需要更多的灵活性,如可选的占位符或可变长度的列表)。在后一种情况下,提供给模板引擎的占位符的数据结构只是一个带有键和值的hashmap(而不是带有getters和setters的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模板

通过使用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 based test output

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

当需要更复杂的占位符时(例如长度可变的列表),或者你想把你的占位符分成多个嵌套的哈希(就像你在POJO模型中的嵌套对象一样),也可以通过使用更复杂的键名来实现(如 |set value|[email protected]|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,并执行pagetest。

© www.soinside.com 2019 - 2024. All rights reserved.