基于 Junit 的接口自动化测试框架实现!_junit测接口,2024年最新小白必看

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

接口测试关键实践

1. 数据准备

接口测试的数据准备,一般是指数据库的数据准备,有时候还包括文件和缓存的数据准备。具体实现可以从下面几个方面去考虑

(1)硬编码的方式准备测试数据,在写测试代码的时候,使用到什么数据就插入什么数据。为了避免数据重复,很多人会习惯于使用随机字符或随机数(这种方法可能造成测试用例不稳定,尽量避免)。

(2)可以直接通过调用其他 API 的方式准备测试数据,这种情况在测试最上层服务的时候比较有用,比如测试购买商品,就需要准备要购买的商品数据,购买商品的用户数据,这个时候,可以直接调用生成商品的 API 和生成用户的 API 直接生成测试数据。此方法实现简单,但前提是需要具备相应的 API 并且此 API 功能正确。

(3)使用 Excel 或 XML 准备测试数据,这种准备测试数据的方式,主要针对对象数据的准备,比如可以将一条商品数据对应 Excel 中的一条数据,因为一般开发都会使用 pojo 映射,而在准备测试数据的时候,这些 pojo 对象属性的设置往往是重复和大工作量的,用 Excel 或 XML 方式准备,则可以减少在代码当中重复去准备这些数据。

一般我们使用的是 2/3 两种方式,其中 3 这种方式主要利用 Dbunit、Spring-test、Unitils 等测试框架的特性经二次开发增加自定义注解,很轻松的导入 Excel 或 XML 格式的文件并在测试完成后对数据进行自动回滚。

/**

  • @ClassName: TestJdbcDataSet
  • @Description: 采用自定义 TestDataSet 注解方式准备测试数据,推荐。
  • @author Cay.Jiang
  • @date 2017 年 7 月 10 日 上午 9:10:29

*/
public class TestJdbcDataSet extends BaseCase{
Map<String, Object> args = new HashMap<String, Object>();
@Test
@TestDataSet(locations={“/tmp/domaininfo.xls”},dsNames={“mysqlDataSource”})
public void test01_mysql(){
args.put(“selfdomain”, “baidupc2”);
List<Map<String, Object>> result=JdbcUtil.queryData(mysqlJdbcTemplate, “domaininfo”, args);
System.out.println(result);
assertEquals(" 合作商接入名称 ",result.get(0).get(“remark”));
}
}

上面代码中的 /tmp/domaininfo.xls 参见:domaininfo.xls ,其中 Excel 格式以 Sheet 名为表名,第一行定义了字段名称,其余行为对应的数据。

多数据集:
@TestDataDataSet(locations={“Data1.xls”,“Data2.xls”},dsNames={“dsNameA”,“dsNameB”}),Data1.xls 的数据会插入 dsNameA 所指的数据库中,Data2.xls 的数据会插入 dsNameB 所指的数据库中

2. 断言

常见的断言方式有 JUnit 自带的 Assert 和 Hamcrest。JUnit 自带的断言方法功能十分有限只能满足最基本的需求。Hamcrest 相对来讲功能丰富一些,但是该库已经多年不更新。而且 Hamcrest 和 JUnit 自带的断言方法一样,有个致命的缺点,就是当一个 case 中有多个断言时,如果其中一个断言失败,那么在它之后的断言都不会执行。这里向大家推荐一款新的断言神器 AssertJ。

AseertJ: 号称流式断言。什么是流式,常见的断言器一条断言语句只能对实际值断言一个校验点,而 AseertJ 支持一条断言语句对实际值同时断言多个校验点,这样使得断言的语句更加简洁适合阅读。AseertJ 还支持一次性执行所有断言,然后收集所有失败的断言一起反馈。当然除此之外 AseertJ 还有很多其他特性,可以参考官方文档慢慢挖掘。下面将举例说明一下 AseertJ 的优势:

public class TestCase extends BaseCase{
UserProfileBO user = new UserProfileBO();
@Before
public void init(){
user.setAddress(" 杭州 “);
user.setMobile(“1386800000”);
user.setUserName(” 测试账号 ");
}

/*

  • JUnit 内置的断言
  • 1、其中一个断言失败后,后面所有断言将不会执行。
  • 2、支持的断言方法较少

*/
@Test
public void testAssertJUnit(){

Assert.assertEquals(" 地址 “,user.getAddress(),” 宁波 “);
Assert.assertEquals(” 手机 “,user.getMobile(),“13868000000”);
Assert.assertEquals(” 手机 “,user.getUserName(),” 测试 ");

Assert.assertNotNull(user.getMobile());
Assert.assertTrue(user.getMobile().startsWith(“138”));
Assert.assertTrue(user.getMobile().length() == 11);

}

/*

  • Hamcres 断言
  • 1、其中一个断言失败后,后面所有断言将不会执行。
  • 2、支持的断言方法丰富,但是已经多年不更新。

*/
@Test
public void testHamcrestMatchers() {

MatcherAssert.assertThat(user.getAddress(), equalTo(" 宁波 “));
MatcherAssert.assertThat(user.getMobile(), equalTo(“13868000000”));
MatcherAssert.assertThat(user.getUserName(), equalTo(” 测试 "));

MatcherAssert.assertThat(user.getMobile(), allOf(is(nullValue()),startsWith(“136”)));
}

/*

  • AssertJ 断言
  • 1、支持所有断言执行后,失败断言统一反馈。
  • 2、支持的断言方法丰富。
  • 3、支持流式断言,方便阅读。

*/
@Test
public void testAssertJ(){

// 断言集合,执行所有断言后,失败断言统一反馈。
SoftAssertions.assertSoftly(softly -> {
softly.assertThat(user.getAddress().equals(" 宁波 “));
softly.assertThat(user.getMobile().equals(“13868000000”));
softly.assertThat(user.getUserName().equals(” 测试 "));
});

// 流式断言
Assertions.assertThat(user.getMobile())
.isNotNull()
.startsWith(“136”)
.hasSize(11);

}
}

3.jenkins 集成接口测试

(1)设置测试代码的仓库地址及身份信息

(2)设置 maven 运行参数

希望执行部分接口用例,可以通过-Dtest=XXX(测试类名) 的方式执行指定的 case,多个类名用逗号 “,” 隔开

(3)设置 Job 执行机制,下图表示每天定时执行

4.pipeline 参数注入

前面写 pipeline 的时候提过,我们的接口测试代码是需要支持外部参数注入的,比如测试的服务地址,不同的分支代码可能部署在不同测试服务器上,需要在 pipeline 中通过参数化的方式驱动对不同的服务器进行接口测试。

这里我们可以使用 maven 的-D(Properties 属性)来实现,举例如下:

(1)dubbo 使用 properties 配置文件,但具体参数使用 ${key}占位符方式打包替换

(2)maven 的 pom 文件中指定对应配置文件中的参数值 (此处指定的参数值会被通过 maven -D 传递过来的参数值覆盖)

此处注意:还需要启动 resources 的 filter 过滤器

(3) 使用 maven 命令行设置属性值

并对该值进行参数化支持 pipeline 传参

5.Pipeline 代码实现

stage(’ 接口自动化测试 ') {
steps{
echo “starting interfaceTest…”
script {
// 为确保 jetty 启动完成,加了一个判断,确保 jetty 服务器启动可以访问后再执行接口层测试。
timeout(5) {
waitUntil {
try {
// 确保 jetty 服务的端口启动成功
sh “nc -z ${serverIP} j e t t y P o r t " / / s h " w g e t − q h t t p : / / {jettyPort}" //sh "wget -q http:// jettyPort"//sh"wgetqhttp://{serverIP}:KaTeX parse error: Expected 'EOF', got '}' at position 39: …l" return true }̲ catch (excepti…{serverIP}😒{params.dubboPort}”)]
}
}
}

测试代码规范 (仅供参考)
  1. 测试项目命名规范

接口测试:
一般需要独立测试项目,测试项目的命名规则为:“test-“+ 被测试的项目名,如 test-kano。
单元测试:
不需要重建独立测试项目,和开发代码放在同一项目即可。

  1. 测试目录定义规范

测试代码统一放在测试项目的 “src/test/java” 下。
测试配置文件统一放置在 “src/test/resources” 下。

  1. 包名定义规范

与被测试项目中的包名一致。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. 包名定义规范

与被测试项目中的包名一致。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-laXr08P0-1713477342317)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值