接着上篇,这次引用python自带的测试框架去优化代码,下面我们开始
一、引用unittest测试框架(单一测试用例)
代码示例
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_python.py
# @Time : 2019/8/17
# @Author : zhong
# @Blog : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流 : 3227456102
import requests
# 引入config配置接口的文件
import config
# 增加单元测试框架
import unittest
"""
注意事项:unittest这个框架只支持test开头的函数体才会去执行哦
"""
# 创建一个类型,执行用例的类,继承unittest的testcase类
class JieKoutest(unittest.TestCase):
def setUp(self):
print("setUp")
pass
def tearDown(self):
print("tearDown")
pass
# 测试注册接口的函数
def test_register(self):
"""测试注册接口"""
# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)
print(r.text)
# 测试登录接口的函数
def test_login(self):
"""测试登录接口"""
# 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
r = requests.post(config.url_login)
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
print(r.json())
# 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
expected = '裤子男夏季'
# 获取接口的返回信息
j = r.json()
# 输出接口的返回信息
print(j)
# 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
# j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
self.assertEqual(expected, j['result'][1][0])
print(r.text)
if __name__=='__main__':
# 第一种方式:通过class("test_xxx")来加载测试用例
# suite = unittest.TestSuite()
# suite.addTest(JieKoutest("test_register"))
# suite.addTest(JieKoutest("test_login"))
# runner = unittest.TextTestRunner()
# runner.run(suite)
# 第二种方式:通过makeSuite方式加载测试用例
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(JieKoutest))
runner = unittest.TextTestRunner()
runner.run(suite)
# 第三种方式:通过TestLoader().loadTestsFromTestCase()方式加载测试用例
# suite1 = unittest.TestLoader().loadTestsFromTestCase(JieKoutest)
# suite = unittest.TestSuite([suite1])
# unittest.TextTestRunner().run(suite)
运行结果
D:\python\python3.6.1\python36.exe E:/study/InterfaceTest/interface_python.py
setUp
F200
{'result': [['裤子女2019新款', '5190686.805512066'], ['裤子女夏', '10489290.115309939'], ['裤子男', '10031538.405101819'], ['裤子男夏季', '4436129.512720286'], ['裤子男韩版潮流', '10121279.603580382'], ['裤子女宽松', '5048949.4381212955'], ['裤子女宽松 直筒', '2398009.2506967783'], ['裤子套装女夏时尚', '456376.80136986304'], ['裤子套装夏女', '2056377.6324909746'], ['裤子女显瘦百搭', '1175564.9047796102']]}
{'result': [['裤子女2019新款', '5190686.805512066'], ['裤子女夏', '10489290.115309939'], ['裤子男', '10031538.405101819'], ['裤子男夏季', '4436129.512720286'], ['裤子男韩版潮流', '10121279.603580382'], ['裤子女宽松', '5048949.4381212955'], ['裤子女宽松 直筒', '2398009.2506967783'], ['裤子套装女夏时尚', '456376.80136986304'], ['裤子套装夏女', '2056377.6324909746'], ['裤子女显瘦百搭', '1175564.9047796102']]}
tearDown
setUp
200
b''
tearDown
.
======================================================================
FAIL: test_login (__main__.JieKoutest)
测试登录接口
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:/study/InterfaceTest/interface_python.py", line 127, in test_login
self.assertEqual(expected, j['result'][1][0])
AssertionError: '裤子男夏季' != '裤子女夏'
- 裤子男夏季
+ 裤子女夏
----------------------------------------------------------------------
Ran 2 tests in 0.038s
FAILED (failures=1)
Process finished with exit code 0
解析:
可以看出通过unittest框架整理后的代码看起来很清晰,同时也支持多种不同的读取测试用例集以及运行测试用例的方法。
二、引用unittest测试框架(多条测试用例)
1、首先看下目录结构
从目录可以看到,config配置文件单独区分在config文件下,测试用例单独区分放在testcase文件夹下,后续有增加用例可直接添加在testcase文件夹下即可调用使用,interface_python为程序运行的总入口(其中文件夹下的__init__文件是格式自带,默认不做任何修改即可)
2、config.py配置文件:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: config.py
# @Time : 2019/8/16
# @Author : zhong
# @Blog : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流 : 3227456102
"""(接口代码封装---请求地址与逻辑代码区分之get请求)"""
# baseurl 接口一般分为测试接口和正式接口
# baseurl = 'http://suggest.taobao.com'
#
# # 设定登录接口为baseurl
# url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
#
# # 设定注册接口
# url_register = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
#
# # 设定首页接口
# url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
"""(接口代码封装---请求地址与逻辑代码区分之post请求)"""
# baseurl 接口一般分为测试接口和正式接口
baseurl = 'http://suggest.taobao.com'
# 设定登录接口为baseurl
url_login = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
# 设定注册接口
url_register = {'注册接口': baseurl + '/sug', 'parmras': {'code': 'utf-8', 'q': '裤子', 'callback': 'cb 用例'}}
# 设定首页接口
url_home = baseurl + '/sug?code=utf-8&q=裤子&callback=cb 用例'
interface_get_test1.py文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_test1.py
# @Time : 2019/8/16
# @Author : zhong
# @Blog : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流 : 3227456102
import requests
from config import config # 导入config配置文件
import unittest
# 创建一个类型,执行用例的类,继承unittest的testcase类
class Login(unittest.TestCase):
def setUp(self):
print("setUp")
pass
def tearDown(self):
print("tearDown")
pass
def test_longin(self):
"""测试登录接口"""
# 发送请求 ,使用config.来调用想要的接口,这里调用首页接口
r = requests.get(config.url_home)
# 请求的状态码 200代表成功
status = r.status_code
# 进行接口状态码断言 等于200则PASS ,否则为FAIL
if status == 200:
print('测试用例PASS')
else:
print('测试用例FAIL')
print(status)
# 请求的内容
j = r.json()
# 判断接口返回内容,存在则PASS,否则为FAIL
if '裤子男夏季1' in str(j):
print('存在此数据')
else:
print('不存在此数据')
print(j)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(Login("test_longin"))
runner = unittest.TextTestRunner()
runner.run(suite)
interface_post_test2.py文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_post_test2.py
# @Time : 2019/8/16
# @Author : zhong
# @Blog : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流 : 3227456102
import requests
from config import config # 引入config配置接口的文件
import unittest
# 创建一个类型,执行用例的类,继承unittest的testcase类
class Register(unittest.TestCase):
def setUp(self):
print("setUp")
pass
def tearDown(self):
print("tearDown")
pass
# 测试注册接口的函数
def test_register(self):
"""测试注册接口"""
# 发送post请求,通过config文件获取接口url 和接口的参数 ,如果参数更改了,咱们就修改config文件就可以了
r = requests.post(config.url_register['注册接口'], config.url_register['parmras'])
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
# 因为展示测试的接口没有json,所以只能输出content啦~
print(r.content)
print(r.text)
# 测试登录接口的函数
def test_login(self):
"""测试登录接口"""
# 因为发送的get请求,参数是跟在接口的后面的,所以不用通过字典的形式获取
r = requests.post(config.url_login)
# 请求的状态码 200代表成功
status = r.status_code
# 使用unittest的断言
self.assertEqual(200, r.status_code)
# 输出状态码
print(status)
print(r.json())
# 预期结果 在接口返回结果后,查看接口里面有没有此值,也就是传说的断言了
expected = '裤子男夏季'
# 获取接口的返回信息
j = r.json()
# 输出接口的返回信息
print(j)
# 进行断言操作和接口的返回值,expected是预期结果是咱们提前知道的内容想去判断接口里面有没有此值
# j['result'][1][1]是接口返回的一个,因为接口第一次是字典,所以通过key去取,里面嵌套是数组格式~
self.assertEqual(expected, j['result'][1][0])
print(r.text)
if __name__ == '__main__':
suite = unittest.TestSuite()
suite.addTest(Register("test_register"))
runner = unittest.TextTestRunner()
runner.run(suite)
interface_python.py文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File Name: interface_python.py
# @Time : 2019/8/17
# @Author : zhong
# @Blog : https://www.jianshu.com/search?q=keitwo&page=1&type=note
# @QQ交流 : 3227456102
import requests
import unittest,time
if __name__=='__main__':
suite_get = unittest.TestLoader().loadTestsFromNames(['testcase.interface_get_test1']) # testcase为当前文件名
suite_post = unittest.TestLoader().loadTestsFromNames(['testcase.interface_post_test2']) # testcase为当前文件名
runner = unittest.TextTestRunner()
runner.run(suite_get)
runner.run(suite_post)
3、运行结果
D:\python\python3.6.1\python36.exe E:/study/InterfaceTest/interface_python.py
setUp
测试用例PASS
200
不存在此数据
{'result': [['裤子女2019新款', '5110081.801057244'], ['裤子女夏', '10454271.811273694'], ['裤子男', '10068677.046380324'], ['裤子男夏季', '4363835.184022505'], ['裤子男韩版潮流', '10246608.448518991'], ['裤子女宽松', '4966366.141918714'], ['裤子女宽松 直筒', '2417728.3492235206'], ['裤子套装女夏时尚', '709457.3409090909'], ['裤子套装夏女', '2153927.209202013'], ['裤子女显瘦百搭', '1121880.3213848574']]}
tearDown
setUp
.
----------------------------------------------------------------------
Ran 1 test in 0.083s
OK
200
{'result': [['裤子女2019新款', '5110081.801057244'], ['裤子女夏', '10454271.811273694'], ['裤子男', '10068677.046380324'], ['裤子男夏季', '4363835.184022505'], ['裤子男韩版潮流', '10246608.448518991'], ['裤子女宽松', '4966366.141918714'], ['裤子女宽松 直筒', '2417728.3492235206'], ['裤子套装女夏时尚', '709457.3409090909'], ['裤子套装夏女', '2153927.209202013'], ['裤子女显瘦百搭', '1121880.3213848574']]}
{'result': [['裤子女2019新款', '5110081.801057244'], ['裤子女夏', '10454271.811273694'], ['裤子男', '10068677.046380324'], ['裤子男夏季', '4363835.184022505'], ['裤子男韩版潮流', '10246608.448518991'], ['裤子女宽松', '4966366.141918714'], ['裤子女宽松 直筒', '2417728.3492235206'], ['裤子套装女夏时尚', '709457.3409090909'], ['裤子套装夏女', '2153927.209202013'], ['裤子女显瘦百搭', '1121880.3213848574']]}
tearDown
FsetUp
200
b''
tearDown
.
======================================================================
FAIL: test_login (testcase.interface_post_test2.Register)
测试登录接口
----------------------------------------------------------------------
Traceback (most recent call last):
File "E:\study\InterfaceTest\testcase\interface_post_test2.py", line 59, in test_login
self.assertEqual(expected, j['result'][1][0])
AssertionError: '裤子男夏季' != '裤子女夏'
- 裤子男夏季
+ 裤子女夏
----------------------------------------------------------------------
Ran 2 tests in 0.049s
FAILED (failures=1)
Process finished with exit code 0
当前运行结果只在编译器中输出,后续增加测试报告输出,并优化测试报告显示(可视化测试报告),以及增加邮件抄送等内容,见下集分解