FitNesse的新手,我想使用RestFixture测试Rest API,但不知道从哪里开始。
有人可以给我逐步的工作流程以及GET,POST和DELETE请求的示例决策表吗?
我们使用JSON响应,发布时如何在决策表中输入它们?
谢谢
此答案提供了一个用于安装RestFixture的食谱,并提供了一部分来介绍验收测试框架。
了解如何从RestFixture开始的一种方法是查看RestFixtureLiveDoc。该项目提供RestFixture本身的文档,由Maven管理。如果您更喜欢这种方式,请阅读以下内容。
java -version
中尝试)mvn --version
)创建一个空的Maven项目(如here所述)。简而言之:
mvn archetype:generate -DgroupId=smartrics.restfixture.sample -DartifactId=scratch -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
src/test/java/smartrics/restfixture/sample/*.java
src/main/java/smartrics/restfixture/sample/*.java
cd scratch
(或您选择的名字)并编辑pom.xml
<dependency>
<groupId>smartrics.restfixture</groupId>
<artifactId>smartrics-RestFixture</artifactId>
<version>4.1</version>
</dependency>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<configuration>
<outputDirectory>${project.build.directory}/dependencies</outputDirectory>
</configuration>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
mvn package
并生成/复制依赖项(在target/dependencies
目录中检查它们)<dependency>
<groupId>org.fitnesse</groupId>
<artifactId>fitnesse</artifactId>
<version>20151230</version>
</dependency>
mvn clean package
start.bat
,以创建fitnesse的启动命令(在Linux上,您应该能够创建等效的start.sh
setLocal EnableDelayedExpansion
set CLASSPATH="
for /R target\dependencies %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!"
java -cp !CLASSPATH! fitnesseMain.FitNesseMain -p 9090 -d src\main\resources -e 0
start.bat
开始FitNesse(FitNesse创建所有相关资源需要一些时间)http://localhost:9090
以检查其是否有效CTRL-C
停止FitNessetarget/
src/main/resources/FitNesseRoot/files/testResults
src/main/resources/FitNesseRoot/ErrorLogs
src/main/resources/FitNesseRoot/RecentChanges
src/main/resources/FitNesseRoot/properties
src/main/resources/FitNesseRoot/updateDoNotCopyOverList
src/main/resources/FitNesseRoot/updateList
src/main/resources/FitNesseRoot/Fitnesse/UserGuide
src/main/resources/FitNesseRoot/PageFooter
src/main/resources/FitNesseRoot/PageHeader
src/main/resources/FitNesseRoot/TemplateLibrary
在运行FitNesse的情况下,转到主页并进行编辑。
MyTestSamples
,然后保存。MyTestSamples[?]
,因为该页面不存在。!define TEST_SYSTEM {slim}
!path target/dependencies/*.jar
添加对RestFixture类和依赖项的引用并使用Slim Test system
MyTestSamples
页面中,从“添加”菜单添加新的“测试”页面。MySample1
,保存MySample1
,编辑页面并键入以下内容。然后保存| Import | | smartrics.rest.fitnesse.fixture | |Table: Rest Fixture | http://jsonplaceholder.typicode.com/ | | GET |/users | 200 | Content-Type : application/json; charset=utf-8 | jsonbody.length == 10|
- 如果一切正常,请单击页面上的Test,测试应运行并通过。
您可以通过下载并解压缩具有依赖关系的RestFixture来手动构建项目,以实现相同的设置(可从链接bin.zip here下载)。但是从长远来看,我发现Maven方法更简单。
RestFixture使用slf4j,但没有记录器桥。要完成日志系统的配置,请添加以下依赖项:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.20</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency>
然后在
src\main\resources\log4j.xml
处创建具有以下内容的配置文件
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <appender name="FILE" class="org.apache.log4j.FileAppender"> <param name="file" value="restfixture.log" /> <param name="append" value="false" /> <param name="threshold" value="debug" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ISO8601} %-5p [%c{1}] - %m%n" /> </layout> </appender> <category name="smartrics.rest.client" additivity="false"> <priority value="INFO" /> <appender-ref ref="FILE" /> </category> <category name="smartrics.rest.fitnesse.fixture" additivity="false"> <priority value="DEBUG" /> <appender-ref ref="FILE" /> </category> <category name="httpclient.wire" additivity="false"> <priority value="ERROR" /> <appender-ref ref="FILE" /> </category> <root> <priority value="ERROR" /> <appender-ref ref="FILE" /> </root> </log4j:configuration>
httpclient.wire
记录器可以设置为DEBUG,以观察网络上的HTTP流量。
用于登录FitNesse服务器(在本教程范围之外)check here
[JUnit运行器
:FitNesse测试可以使用JUnit as well通过Maven Surefire plugin运行。
在src/test/java/smartrics/restfixture/sample/RunnerTest.java
中创建测试类运行器
package smartrics.restfixture.sample; import java.io.File; import org.junit.Before; import org.junit.Test; import fitnesse.junit.JUnitHelper; public class RunnerTest { private JUnitHelper helper; @Before public void prepare() { helper = new JUnitHelper("src/main/resources", new File("target", "fitnesse-junit").getAbsolutePath()); helper.setPort(9090); } @Test public void restFixtureTests() throws Exception { helper.assertSuitePasses("MyTestSamples.MySample1"); } }
然后在pom文件中安装surefire插件:
中可用<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.17</version> <configuration> <forkMode>always</forkMode> </configuration> </plugin>
保存pom.xml文件并运行
mvn clean package
以运行带有测试的构建。构建将通过,并且报告将在/target/fitnesse-junit/MyTestSamples.MySample1.html
参考
RestFixture设计为专注于受测试服务公开的REST API。 Wiki内容与结构化夹具的混合和匹配确实为提供实时文档提供了两全其美的方法。
RestFixture也可以扩展以提供其他功能。
[针对API编写接受测试时,重要的是突出显示HTTP请求/响应交互的各个部分:VERB,URI,请求/响应正文,请求/响应HEADER和RETURN状态代码。
RestFixture通过以FitNesse表形式表达这些部分中的每个部分来做到这一点:
| Table: Rest Fixture | <base uri> | | setBody | <body> | | setHeaders | <headers> | VERB | /URI | <expected return status code> | <expected response headers | <expected response body> |
<expected ...>
单元格可能为空。如果为空,则不会检查任何期望。
[setHeaders
和setBody
仅与需要实体的动词有关(POST,PUT等)
此外,通过使用let
,可以从HTTP响应的一部分中提取数据并与其他设备和测试共享。
((RestFixtureLiveDoc)1提供了一组由RestFixture实现的各种功能的综合示例,但在此处-以供参考-主要特征的摘录。
RestFixtureConfig
(RestFixtureConfig)11是设置RestFixture配置参数的简单夹具。可以在named
配置装置中覆盖配置参数,并将其传递给RestFixture实例。例如|Table: Rest Fixture Config | my_config | | name1 | value1 | | name2 | value2 | |Table: Rest Fixture | http://host:8080/path | my_config | | ... |
RestFixture操作
支持的HTTP操作是:GET
,POST
,PUT
,DELETE
,HEAD
,OPTION
,TRACE
。例如:
| Table: Rest Fixture |http://host:8080 | |GET | /resources/0 | 200 | Content-Type: application/json | jsonbody.name === 'Ted' |
OR
| Table: Rest Fixture |http://host:8080/path | |GET | /resources/0 | 200 | Content-Type: application/xml | //name[text()='Ted'] |
根据作者可能希望传达的信息,可以提供期望单元格(每行的第三,第四和第五单元格)进行验证。
可以提供类似于上述示例的简单夹具来测试和记录服务公开的REST api。
共享数据
使用let
共享数据以从响应中提取。
| Table: Rest Fixture |http://host:8080/path | |GET | /resources/0 | 200 | Content-Type: application/json | jsonbody.name === 'Ted' | | let | name | js | response.jsonbody.name | |
在这里,符号
name
设置为json表达式response.jsonbody.name
的值。response
是包含最后一个HTTP响应的json对象,jsonbody
是包含在响应正文中的JSON对象的响应对象。
该符号可以在其他灯具中进一步使用:
| setBody | { 'some_name' : '%name%' } |
或
| script | another fixture | | check | not null | $name |
交易
还可以对提供应用程序事务的多个操作进行系统测试和记录(在此处失去意义)。
| Table: Rest Fixture | http://host:port | | comment | an order is created ... | | POST | /orders | | | | | let | orderIdUri | header | Location: (.+) | | | GET | %orderIdUri | | | | | let | email | js | response.jsonbody.address.email | | setBody |!- { 'payload' : { 'message' : 'order sent', 'email' : '%email% } -!| | comment | and a confirmation can be sent | | POST | /notifications | 201 | | |
上面的示例记录了将API用作应用程序事务的方法。
扩展RestFixture
RestFixture可以扩展以提供其他功能。提供了两种方法:
可以通过配置将简单的Javascript代码嵌入到RestFixture中。
| Table: Rest Fixture Config | imp | | restfixture.javascript.imports.map | !- sampleJs=src/main/resources/FitNesseRoot/files/javascript/sample.js -|
上面的配置-使用时-会将Javascript加载到作为路径提供的文件中,并使其在期望处理程序的上下文中可用:
| Table: Rest Fixture |http://host:port | imp |
| GET | /resources/1.json | 200 | | |
| let | sum | js | var sum = sampleAdd(1, 2); sum;| |