FitNesse:使用RestFixture创建测试的工作流程

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

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

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

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

谢谢

fitnesse restfixture
1个回答
17
投票

此答案提供了一个用于安装RestFixture的食谱,并提供了一部分来介绍验收测试框架。

安装

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

假设

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

食谱

  1. 创建一个空的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
  2. cd scratch或您选择的名字)并编辑pom.xml

  3. 添加RestFixture依赖项(RestFixture的最新版本为here)。例如:
<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版本(检查可用的最新版本here),>
  3. <dependency>
        <groupId>org.fitnesse</groupId>
        <artifactId>fitnesse</artifactId>
        <version>20151230</version>
    </dependency>
    
  1. 然后做mvn clean package
  2. 创建具有此内容的文件start.bat,以创建fitnesse的启动命令(在Linux上,您应该能够创建等效的start.sh
  3. ):
    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. start.bat开始FitNesse(FitNesse创建所有相关资源需要一些时间)
    • 从浏览器转到http://localhost:9090以检查其是否有效
  2. 您可以用CTRL-C停止FitNesse
  3. 您现在应该考虑进行版本控制。如果使用git,这些项目可能会添加到忽略列表中:
  4. 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,然后保存。
    • 您应该看到MyTestSamples[?],因为该页面不存在。
    • 单击问号以编辑页面
    • 附加以下几行
  2. !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|
    
    1. 如果一切正常,请单击页面上的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

    中可用

    参考

    • pom.xml为here
    • start.bat是here
    • 验收测试

    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 ...>单元格可能为空。如果为空,则不会检查任何期望。

    [setHeaderssetBody仅与需要实体的动词有关(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操作是:GETPOSTPUTDELETEHEADOPTIONTRACE。例如:

    | 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可以扩展以提供其他功能。提供了两种方法:

    1. 通过Java:扩展RestFixture Java以添加/更改行为。有关示例,请检查(RestFixtureExtensions)12项目。
    2. 通过Javascript:如下所述
    3. 可以通过配置将简单的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;| |
    
    © www.soinside.com 2019 - 2024. All rights reserved.