Hello,好久没更新了,今天跟大家一起来学习下基于unittest的接口自动化测试,先给大家看下最终的unittest框架目录结构:
这里大家需要下载的第三方库分别是:
pip3 install requests/pip3 install ddt/pip3 install openpyxl/pip3 install mysql-connector/pip3 install unittest
可能会有些许的遗漏,具体大家在写的时候,如果发现第三方没有,自己再安装下。
(一:)接下来,我们先来学习下这个第三方库:requests,这个库可以通过接口的请求方式来做接口的触发,主要是协助完成http请求,这里主要介绍我们常见的两种请求方式:get/post,直接上代码(下面这段代码小伙伴们可以拿来直接练手):
import requests,json
url='http://web.juhe.cn:8080/constellation/getAll'
body={
"key":"921d7e156beff25d4d61c407ea345fdb",
"consName":"双鱼座",
"type":"today"
}
response_get=requests.get(url,params=body)
print('响应状态码:',response_get.status_code)
print('响应文本:',response_get.text)
print('响应头:',response_get.headers)
print('----------------------------------------')
response_post=requests.post(url,data=body)
print('响应状态码:',response_post.status_code)
print('响应文本:',response_post.text)
print('响应头:',response_post.headers)
输出的结果:
响应头: {'Server': 'nginx', 'Date': 'Tue, 28 Apr 2020 02:52:42 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '490', 'Connection': 'keep-alive', 'Set-Cookie': 'JSESSIONID=B85EFCBD82811C355C48DCCD84F87013; Path=/constellation; HttpOnly'}
响应状态码: 200
响应正文: {"date":20200428,"name":"双鱼座","QFriend":"双子座","color":"橘色","datetime":"2020年04月28日","health":"60","love":"70","work":"60","money":"60","number":9,"summary":"今天自己会很想组织一个聚会,反正会想各种懒散。不过今天要注意下人际交往,今天自己的想法不太容易被他人重视,不过自己也不是那么计较。今天在人际或是活动中也容易遇到猪队友影响心情。","all":"80","resultcode":"200","error_code":0}
----------------------------------------
响应头: {'Server': 'nginx', 'Date': 'Tue, 28 Apr 2020 02:52:42 GMT', 'Content-Type': 'text/html;charset=UTF-8', 'Content-Length': '490', 'Connection': 'keep-alive', 'Set-Cookie': 'JSESSIONID=48C75CAE9ECFF8B55505A72ABB8EDCDD; Path=/constellation; HttpOnly'}
响应状态码: 200
响应正文: {"date":20200428,"name":"双鱼座","QFriend":"双子座","color":"橘色","datetime":"2020年04月28日","health":"60","love":"70","work":"60","money":"60","number":9,"summary":"今天自己会很想组织一个聚会,反正会想各种懒散。不过今天要注意下人际交往,今天自己的想法不太容易被他人重视,不过自己也不是那么计较。今天在人际或是活动中也容易遇到猪队友影响心情。","all":"80","resultcode":"200","error_code":0}
这里需要跟大家说明的是:我这里没有上送请求头,有些接口是需要上送请求头headers的,所以如果有请求头,需要注意的是请求头里是否有如下的头信息:
header={
"Content-Type": "application/json"
}
如果请求头里已经表明json,那么我们在发接口的时候,请求体body里面需要转换下类型,主要是把dict转成json,可以使用json.dumps(),另外把json转成dict,可以使用json.loads()
(二:)接下来,我们来学习下unittest框架,这个框架我个人觉得,如果公司的接口与接口之间依赖性不是很高的,那用这个框架还是可以的,如果依赖性很高,那用起来会有些许的不方便,反而用其他一些工具效率来的更高,比如:jmeter、postman,这里的依赖性很高,指得是上一个接口应答报文的某个值是下一个请求报文的入参,所以我们需要对接口做相应的关联。
先来学习下unittest框架的基本结构:
import unittest
class TestDemo(unittest.TestCase):
@classmethod
def setUpClass(cls)->None:
print('1')
def setUp(self)->None:
print('2')
def tearDown(self)->None:
print('3')
@classmethod
def tearDownClass(cls)->None:
print('4')
def test_01(self):
print('第一个测试案例')
def test_02(self):
print('第二个测试案例')
if __name__=='__main__':
unittest.main()
输出的结果:
1
2
第一个测试案例
3
2
第二个测试案例
3
4
这里需要说明下:首先测试案例必须以test开头来命名,另外setUp()和tearDown是对于每条测试案例执行前每次都要执行一边,简单说就是你有多少条测试案例,就要在每条案例执行前先执行下setUp,案例结束之后每次都要执行一次tearDown,所以从结果可以看出案例执行之前会先输出2,结束会输出3
对于被装饰器修饰的类方法,这个是针对所有的案例开始前setUpClass要执行一次,这里不像setUp,只要执行测试案例它都要执行,同时tearDownClass是所有案例执行结束后执行一次,结合上面的输出结果就很明显了。
(三:)学完unittest,我们来看下测试报告的生成
unittest会自动生成测试报告,但是需要借助第三方的一个报告模板HTMLTestRunner,需要把这个模板存放在python的安装目录的Lib目录下,这个模板可以去官网下载。
下面介绍两种加载测试用例的方法,一种是指向封装测试用例的类,一种是指向封装测试的模块
#1:这是指向模块的加载方法
import unittest
import HTMLTestRunner
suit=unittest.TestSuite()
loader=unittest.TestLoader()
suit.addTest(loader.loadTestsFromModule(test_case))#这里的test_case是之前写的unittest框架中的测试用例的文件名,需要先导入这个模块
with open('test.html','wb',encoding='utf-8') as f:
runner=HTMLTestRunner.HTMLTestRunner(
stream=f,
verbosity=2,
title='测试报告',
description='接口测试用例报告'
)
runner.run(suit)
#2:这是指向类的加载方法
suit=unittest.TestSuite()
loader=unittest.TestLoader()
suit.addTest(loader.loadTestsFromModule(test_case))#这里的test_case是之前写的unittest框架中的测试用例的文件名,需要先导入这个模块
with open('test.html','wb',encoding='utf-8') as f:
runner=HTMLTestRunner.HTMLTestRunner(
stream=f,
verbosity=2,
title='测试报告',
description='接口测试用例报告'
)
runner.run(suit)
#3:另外这里介绍加载单个测试用例的方法
suit=unittest.TestSuite()
suit.addTest(Test_Mathmethod('test_01'))#这里是某个类中的某个方法,所以之前需要导入这个类
with open('','wb',encoding='utf-8') as f:
runner=HTMLTestRunner.HTMLTestRunner(
stream=f,
verbosity=2,
title='测试报告',
description='接口测试用例报告'
)
runner.run(suit)
下期介绍如何从excel中读取数据,以及如何链接数据库,管理我们的配置文件之类的。