cucumber+feature+springBoot实现UI自动化测试
整合目标
本文对Cucumber、feature、spring boot 它们的基本使用和概念就不做解释了,本文主要将它们在项目中进行整合使用,因此在通过spring boot框架开发项目的时候,又能通过 cucumber编写测试用例对项目测试。
1.前提要求
整合之前需要你自己在本地搭建起spring boot项目环境,网上关于spring boot项目搭建很多资料,不明白自行单独解决
2.cucumber和springBoot整合目录
3. idea安装cucumber插件
4.pom.xml导入Cucumber相关jar包
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
// 请在springBoot项目主目录中的pom.xml(前提通过maven构建项目)中导入cucumber相关的jar包
<!-- 依赖cucumber-->
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-java8</artifactId>
<version>3.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-spring</artifactId>
<version>3.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.cucumber</groupId>
<artifactId>cucumber-junit</artifactId>
<version>3.0.2</version>
<scope>test</scope>
</dependency>
5.新建cucumber工作目录
- 在src目录下新建test目录
- test目录下新建 java 目录,并将java目录在idea中设置为:idea中选中此java目录,右键->Mark Directory as -> Test Sources Root
- test目录下新建 resources 目录,也将此目录设置为:idea中选中此java目录,右键->Mark Directory as -> Test Resources Root
- 在对应目录下新建包名,和文件,目录参考下图:
6.在resources->features下新建2个feature用例文件
新建第一个 用例描述文件:feature-file-01.feature
Feature: the greeting msg can be retrieved
Scenario: client makes call to GET /greeting
Given name is "User"
When the client calls /greeting
Then the client receives status code of 200
And the client receives content "Hello, User!"
新建第二个 用例描述文件:feature-file-02.feature
Feature: Is it Friday yet?
Everybody wants to know when it's Friday
Scenario: Sunday isn't Friday
Given today is Sunday
When I ask whether it's Friday yet
Then I should be told "Nop
注意:
1:以上用例描述的语法说明:其中 Feature Scenario Given When Then And 等为 cucumber的Gherkin关键字,具体的使用方法请网上查阅其它资料,本文主要是整合使用内容。
7.新建cucumber运行入口文件
CucumberSpringBootApplicationTests.java
package com.foo.demo;
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;
@RunWith(Cucumber.class) //通过Cucumber方式运行这个类
@CucumberOptions(features = "classpath:features/") //classpath:features/ 表示要运行用例描述文件的目录
public class CucumberSpringBootApplicationTests {
}
8.运行后即可将用例描述文件转换为用例实现类文件方法
1:在 CucumberSpringBootApplicationTests中运行此类。
2:即可在控制台打印出未实现的用例描述所对应的方法:
以上 控制台中 打印出的方法 复制到 test->java->com.foo.demo.stepdefs-> MyStepdefs1.java 中即可,其中MyStepdefs1中的步骤方法名可以设置为中文,但feature文件中关键字是英文,那么 中英文关键字对应关系如下:
9.针对新建的2个feature用例文件,创建对应的用例实现类,即完成用例的具体实现
新建第一个 用例实现类文件:MyStepdefs1.java
// 创建第一个用例实现文件
package com.foo.demo.stepdefs;
import com.zhiqi.futures.service.AlgorithmBaseOfOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import cucumber.api.java8.Zh_cn;
import java.util.Map;
/*
* 注意:在这个用例实现文件中可以不用导入 springBoot的启动入口文件,也就是不管
* 有多少个用例文件时,只需要保证有一个用例文件导入了 springBoot的启动入口文件即可,比如我这就只
* 在 MyStepdefs2.java 进行了 导入:@SpringBootTest(classes = FuturesApplication.class)
*/
public class MyStepdefs1 implements Zh_cn {
String name;
@Autowired
AlgorithmBaseOfOrderService algorithmBaseOfOrderService;
public MyStepdefs1() {
当("^the client calls \\/greeting", () -> {
System.out.println("-----Cucumber框架 即将调用spring boot框架 中的代码----");
//此处为调用 springBoot中service层代码,从而得到返回数据可进行被测项目的测试
Map<Integer,Double> map = algorithmBaseOfOrderService.calculationEveryStepMinPriceOrder("8d018b2027b711ea9a3100163e00a5d2");
System.out.println("map:" + map);
});
假设("name is {string}", (String name) -> {
this.name = name;
});
那么("the client receives status code of {int}", (Integer statusCode) -> {
assert true;
});
同时("the client receives content {string}", (String greeting) -> {
assert true;
});
}
}
新建第二个 用例实现类: MyStepdefs2.java
// 创建第二个用例实现类文件
package com.foo.demo.stepdefs;
import com.zhiqi.futures.FuturesApplication;
import com.zhiqi.futures.service.AlgorithmBaseOfOrderService;
import cucumber.api.java8.Zh_cn;//将feature中用例描述关键字转为中文的支持
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Map;
@SpringBootTest(classes = FuturesApplication.class) //注意:FuturesApplication引入的是springboot中的启动入口文件,此处为cucumber整合springBoot的关键所在。
//其中SpringBootTest注解即可表示 测试的springBoot项目
public class MyStepdefs2 implements Zh_cn {
//通过 Autowired注解 注入springBoot中的service层,从而实现在cucumber用例中调用被测项目的service层进行测试
@Autowired
AlgorithmBaseOfOrderService algorithmBaseOfOrderService;
public MyStepdefs2() {
/*
* 其中 假设 当 那么 这样的方法是由 feature文件中自动生成的。
*/
假设("^today is Sunday$", () -> {
System.out.println("1");
});
当("^I ask whether it's Friday yet$", () -> {
System.out.println("2");
});
那么("^I should be told \"Nop$", () -> {
System.out.println("3");
//在用例文件中调用被测项目的service层进行测试
Map<Integer,Double> map = algorithmBaseOfOrderService.calculationEveryStepMinPriceOrder("8d018b2027b711ea9a3100163e00a5d2");
System.out.println("在第2个feature文件中调用springBoot中的service层:" + map);
assert true;// 用例返回通过,如果false表示用例执行失败
});
}
}
说明:以上的 假设、 当、 那么 等方法就是将 feature文件转换而来,从而进行用例描述的的代码实现,完成预期的测试
10.运行效果
完! cucumber对springBoot的整合完毕,也支持同时运行多个feature用例文件。以上若存在不对的或有什么问题欢迎评论改进!