7

FitNesse 的新手,我想使用 RestFixture 测试 Rest API,但不知道从哪里开始。

有人可以给我一步一步的工作流程和 GET、POST 和 DELETE 请求的示例决策表吗?

我们使用 JSON 响应,发布时如何将它们输入到决策表中?

谢谢

4

1 回答 1

19

这个答案提供了安装 RestFixture 的说明书和介绍验收测试框架的部分。

安装

了解如何开始使用 RestFixture 的一种方法是查看RestFixtureLiveDoc。该项目为 RestFixture 本身提供文档,并由 Maven 管理。如果您更喜欢这种方式,请阅读下文。

假设

  • 您安装了有效且工作的 JDK(从命令提示符尝试java -version
  • 你已经安装了 Maven(试试mvn --version
  • 您安装了版本控制软件。虽然,我不会在这个答案的上下文中讨论如何使用它。

食谱

  1. 创建一个空的 Maven 项目(如此所述)。简而言之:

    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
  2. cd scratch或您选择的任何名称)并编辑pom.xml

  3. 添加 RestFixture 依赖项(最新版本的 RestFixture 在这里)。例如:
<dependency>
        <groupId>smartrics.restfixture</groupId>
        <artifactId>smartrics-RestFixture</artifactId>
        <version>4.1</version>
</dependency>
  1. 添加 Maven 依赖插件以在本地复制依赖项(这不是必需的,但我觉得很方便
<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>
  1. 现在,您应该能够mvn package构建/复制依赖项(在target/dependencies目录中检查它们)
  2. 您可能想要更新到最新的 FitNesse 版本(在此处查看最新版本),通过添加
<dependency>
    <groupId>org.fitnesse</groupId>
    <artifactId>fitnesse</artifactId>
    <version>20151230</version>
</dependency>
  1. 然后做mvn clean package
  2. 创建一个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 
  1. 启动 FitNesse start.batFitNesse 创建所有相关资源需要一些时间
    • 从您的浏览器转到http://localhost:9090以检查它是否有效
    • 您可以通过以下方式停止 FitNesseCTRL-C
  2. 此时您应该考虑提交版本控制。如果你使用 git,这些项目可能会被添加到忽略列表中:
target/
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
  1. 运行 FitNesse,进入主页并进行编辑。

    • MyTestSamples在页面某处添加此 wiki 词,然后保存。
    • 您应该看到MyTestSamples[?],因为该页面不存在。
    • 点击问号编辑页面
    • 附加以下行

    !define TEST_SYSTEM {slim} !path target/dependencies/*.jar

    添加对 RestFixture 类和依赖项的引用并使用Slim 测试系统

    • 保存页面。
  2. MyTestSamples页面中,从添加菜单中添加一个新的测试页面。
    • 调用页面MySample1,保存
  3. 转到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|
  1. 如果一切顺利,通过点击页面上的测试,测试应该运行并通过。

您可以通过手动构建项目来实现相同的设置,方法是下载并解压缩带有依赖项的 RestFixture(从此处的链接 bin.zip 下载。但从长远来看,我发现 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可以设置为调试以观察网络上的 HTTP 流量。

如需登录 FitNesse 服务器(不在本教程的范围内),请查看此处

JUnit 跑步者

FitNesse 测试也可以通过JUnit运行,使用Maven Surefire 插件

在中创建一个测试类运行器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 请求/响应交互的部分:动词、URI、请求/响应 BODY、请求/响应 HEADER 和返回状态代码。

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是一个简单的fixture设置RestFixture配置参数。配置参数可以在命名的配置装置中被覆盖并传递给 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' |

或者

| Table: Rest Fixture |http://host:8080/path |
|GET    | /resources/0 | 200 | Content-Type: application/xml | //name[text()='Ted'] |

根据作者可能想要传达的信息,可以提供期望单元格(每行的第 3、4 和 5 个单元格)进行验证。

可以提供像上面示例这样的简单夹具来测试和记录服务公开的 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.nameresponse是包含最后一个 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 可以扩展以提供额外的功能。提供了两种方法:

  1. 通过 Java:扩展 RestFixture java 以添加/更改行为。例如检查 (RestFixtureExtensions) 12项目。
  2. 通过 Javascript:如下所述

简单的 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;| |
于 2016-03-30T01:38:49.497 回答