1、分析业务接口
- 一般我们都是把excel表格的设计放在第一个,但我认为先分析好你要测的接口,提前确定好你需要的数据是什么,得到的数据是什么,然后你才能设计相应的框架,并思考技术选型。
- 经过分析,我选用Java的HttpsURLConnection库,新建一个请求类,请求方法有get和post两种,get请求的参数放在url后面,post请求参数以json格式放在body中。
- 所以excel作为数据源中需要告诉我用例名称、请求方法、参数的key和value、请求预期的状态码,请求结果中需要检查的值。
- 下一步就是确定用什么方法读取excel表格,我选的是jxl这个库,它的一个特点是只能读取.xls格式的表格,所以我们的数据源也要保存成这个格式。
- 那么读取完数据以后,要把它适当加工成程序更容易理解的格式,这样方便直接用。所以可以设计一个测试数据的类,把每一条测试用例都抽象成一个对象,每次用到数据都是实例化这个类。
- 有了测试数据类和请求类,还差检验结果了。请求的类中可以得到请求的结果,并且对结果进行处理获得状态码和结果body,需要校验的值可以从测试数据类中拿,再去进行对比。
- 这样分析下来,我们需要另一个类,他做的事情就是实例化请求类,用我们写的工具读取excel中的数据,并且把数据给到测试数据类,得到一个测试数据对象,然后对比结果。那么这个类每次测一条用例的时候都要重复做一些动作,比如取数据、对比数据,很像before test和after test的概念,所以这里我选用了TestNG框架。
- 那么我们的项目大概分为几个部分:请求类、测试数据类、发请求的类、各种工具类。这里就很方便去用maven作为一个管理工具
当然,这里只是简单分析思路,后面具体操作的时候,还是会有很多需要思考的细节。
2、设计excel表格
根据上面的分析,我设计的表格的表头有:「Test No.」「enabled」「Testname」「Method」「description」「Protocol」「requestMethod」「Address」「code」「CheckPoint1」「CheckValue1」「CheckPoint2」「CheckValue2」「Key1」「Value1」「Key2」「Value2」「Key3」「Value3」「Key4」「Value4」「Key5」「Value5」
Test No.是序号,给自己看的,enabled表示要不要执行这条用例,这是后来在实践中发现需要这样的开关才加上的,Testname、Method和description是到时候写在测试报告里面当作日志。CheckPoint和CheckValue需要多少个是根据实际需求来的,可以无限扩展。value和key如果是在get方法里,那就用于url后的请求参数,如果是post,就是body中的参数,同样支持无限扩展。我的表格一开始也不是这样的,在实践的过程中慢慢的优化,最后稳定在这样的格式。
3、添加依赖
Maven项目中添加依赖只需要在它的pom.xml文件中添加就可以,最终我的文件是这样的:
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
在https://mvnrepository.com 中搜索你需要用的库,比如testng,选一个版本号,一般用稳定版本,然后详情页中maven栏下的代码复制到你pom.xml中的dependencies标签中,等待项目自己下载好这个库,就可以使用了。
4、工程结构
配置文件
配置文件和表格等都放在resource文件夹中,配置文件主要包含了host、excel的文件位置、请求所需要的header信息
src/main/java
src/main/java里有三个包:test.com.api、test.com.request、test.com.utils和com.test.testdata,分别放了测试类、请求类、工具类和测试数据类
test.com.api包
包下包含2个类,TestApi是所有测试类的基类,它的的作用是读取配置文件中的token信息,如果没有的话就调用registerToken方法写进去,如果有就去更新一下。
1 | public class TestApi { |
另一个类是单接口测试的类,继承了TestApi类,它会实例化请求类和测试数据类,实现发送请求和获取响应结果的功能,代码如下
1 | public class TraverseCases extends TestApi{ |
上面涉及到TestNG的东西,这里就不叙述了,TestNG的用法可以见我的另一偏文章:TestNG。(所有非java提供的类和方法,都是自己写的工具类,具体就不贴出来了)。如果后面要写多接口的测试,也可以用testng中的depend或者dataprovider注释来设计先后的逻辑。
test.com.request包
这个包下只有一个类HttpRequest,这个类里最主要的两个方法是sendGetRequest和sendPostRequest,分别用于发送get请求和post请求。另外还包含了一些对返回结果的处理,以及一些getter方法,代码如下:
1 | public class HttpRequest { |
test.com.testdata包
包里有一个TestData类,抽象出了一条测试用例,话不多说,来看代码:
1 | /** |
test.com.utils包
这个包里我写了很多工具类,就不一一列出代码了,挑一些个别的,比如从excel中读数据的类ExcelProcess:
1 | public class ExcelProcess { |
关于jxl库的使用,这里不赘述了,请参考我的另一篇文章Java Excel API——jxl常用类,里面覆盖到了常用的方法。
5、总结
- 以上展示的是对单接口进的测试,并没有根据实际业务,写一个全链路的接口测试。
- 有了这个框架,后面再有新的接口测试,只需要往表格中添加数据,不需要改动代码,可扩展性强
- 后面会考虑放到Jenkins上定时跑,并且将测试报告发到邮箱中