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

时间:2016-03-02 16:38:55

标签: fitnesse

新手到fitnesse,我想用RestFixture测试Rest APIS,但不知道从哪里开始。

有人可以一步一步地为我提供GET,POST和DELETE请求的样本决策表。

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

由于

1 个答案:

答案 0 :(得分:14)

这个答案提供了一个安装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)。例如:
  4.  
    <dependency>
            <groupId>smartrics.restfixture</groupId>
            <artifactId>smartrics-RestFixture</artifactId>
            <version>4.1</version>
    </dependency>
    
    1. 添加Maven依赖项插件以在本地复制依赖项(这不是必需的,但我觉得很方便
    2. <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. 您可能希望通过添加
      3. 更新到最新的FitNesse版本(检查可用的最新版本here
        <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以检查其是否有效
            • 您可以使用CTRL-C
            • 停止FitNesse
          2. 此时您应该考虑提交版本控制。如果您使用git,这些项目可能会添加到忽略列表中:
          3. 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[?],因为页面不存在。
              • 点击问号编辑页面
              • 附加以下行

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

              添加对RestFixture类和依赖项的引用,并使用Slim Test system

              • 保存页面。
            2. MyTestSamples页面中从“添加”菜单添加新的“测试”页面。
              • 调用页面MySample1,保存
            3. 转到MySample1,编辑页面并输入以下内容。然后保存
            4. | 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. 如果一切正常,通过点击页面上的测试,测试应该运行并通过。
              2. 您可以通过手动构建项目来实现相同的设置,方法是下载并解压缩具有依赖项的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 runner

                可以使用JUnit as well通过Maven Surefire plugin运行FitNesse测试。

                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,请求/响应BODY,请求/响应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配置参数的简单工具。可以在命名的配置夹具中覆盖配置参数,并将其传递给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'] |
                

                根据作者可能想要传达的信息,可以提供期望单元格(每行的第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.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;| |