现有一个自行封装的http_requests模块,用于测试http请求,内容如下:
import requests
class HttpRequests:
def __init__(self,url,para):
self.url = url
self.para = para
def http_requests(self,method):
try:
if method.lower() == 'get':
response = requests.get(self.url,params=self.para)
return response
elif method.lower() == 'post':
response = requests.post(self.url,data=self.para)
return response
elif method.lower() == 'delete':
response = requests.delete(self.url,data=self.para)
return response
except Exception as e:
print('请求错误:',e)
怎样利用python的unittest单元测试对其进行场景覆盖测试呢?
首先明确一下unittest单元测试步骤:
引入unittest模块,unittest模块包括了TestCase--测试用例、TestSuite--测试套、TestLoader--加载器、TextTestRunner--执行测试用例、TextTestResult--测试结果等
--> 创建一个测试类,继承unittest.TestCase类,用于写测试用例
--> 在测试类里定义测试方法,以 test 开头。每一条用例对应一个方法
--> 创建测试套,用于存储测试用例
--> 向测试套里添加测试用例
--> 执行测试用例并生成测试报告
下面一步一步来:
1.引入unittest模块,新建test_reuqests.py文件,一句搞定 import unittest
2.创建测试类,定义测试方法
测试方法就是测试用例,包括预期结果、实际结果,以及预期结果和实际结果的比对结果判断用例是否执行通过
断言:预期结果和实际结果比较,并判断实际结果是否符合预期的过程就是断言
常见的断言方法有:
这里用assertIn的方法,判断预期的字符串是否包含于实际的响应报文中
import unittest
# 引入http_requests模块的httprequests方法
from .http_requests import HttpRequests
# 创建测试类
class TestRequests(unittest.TestCase):
# 创建测试用例,以test开头
def test_001(self):
'''get方法,用户名/密码正确'''
res = HttpRequests('http:/xx.xx.xx.xx:xx/xxx/login',
{'mobilephone':'186********','pwd':'123456'}).http_requests('get')
self.assertIn('登录成功',res.text)
def test_002(self):
'''get方法,密码为空'''
res = HttpRequests('http://xx.xx.xx.xx:xx/xxx/login',
{'mobilephone':'186********','pwd':''}).http_requests('post')
self.assertIn('密码不能为空',res.text)
如上代码创建了测试类TestRequests,并新建了两条测试用例,分别测试用户名密码正确 和 密码为空的情况,还可以新建更多场景的测试用例,和功能测试用例功能点是一样的。
3.创建测试套,并向测试套中添加测试用例
import unittest
from .test_requests import *
# 创建测试用例容器suite
suite = unittest.TestSuite()
向测试套中添加测试用例有三种方法:
a.直接用addTest加载测试用例
# 增加每一条用例:测试类类名(测试方法名)
suite.addTest(TestRequests('test_001'))
suite.addTest(TestRequests('test_002'))
这种方法需要一条一条用例添加,有几条就需要添加几次。
b.通过TestLoader加载测试用例
loader = unittest.TestLoader()
b方法里面又分两种方法:
b1.通过测试类加载测试用例
# 通过测试类加载测试用例 loadTestsFromTestCase
suite.addTest(loader.loadTestsFromTestCase(TestRequests))
这种方法添加某个测试类,会将该测试类里面的测试方法都添加进来,有几个测试类就需要添加几次。
b2.通过测试类所在模块加载测试用例
# 通过测试类所在模块加载测试用例 loadTestsFromModule
# 需要引入测试类模块
from .xx import test_requests
suite.addTest(loader.loadTestsFromModule(test_requests))
这种方法最简便,添加测试模块,会把该测试模块里的所有测试类测试方法都添加进来。因此是最常用的。
4.执行测试用例,并生成测试报告
有两种方法:
a.python里unittest单元测试框架提供了生成txt格式的测试报告方法,可以保存到txt文件里
with open('Test_http_requests.txt','w',encoding='utf-8') as file:
runner = unittest.TextTestRunner(stream=file,verbosity=2) #verbosity表示报告详细情况,0-2,2最详细
runner.run(suite)
这种方法比较简单,只是生成txt格式的报告不是很美观,可读性也不是很强
b.这里我们从github上下载一个HTMLTestRunner模块,重新命名为HTMLTestRunnerNew,并存放在python的lib目录下。
import HTMLTestRunnerNew
with open('Test_http_requests.html','wb+') as file:
runner = HTMLTestRunnerNew.HTMLTestRunner(file,title='http_request测试报告',description='我是描述',tester='南山之喃')
runner.run(suite)
把上面步骤3和4整合一下,加载用例采用最常用的通过测试模块加载用例的方法,完整代码如下:
import unittest
from .test_requests import *
# 创建测试用例容器suite
suite = unittest.TestSuite()
# addTest加载测试用例
# 通过测试类所在模块加载测试用例 loadTestsFromModule -- 最常用
# 需要引入测试类模块
from .xx import test_requests
suite.addTest(loader.loadTestsFromModule(test_requests))
# 执行测试用例并生成测试报告
import HTMLTestRunnerNew
with open('Test_http_requests.html','wb+') as file:
runner = HTMLTestRunnerNew.HTMLTestRunner(file,title='http_request测试报告',description='我是描述',tester='南山之喃')
runner.run(suite)
执行如下代码,就会生成名为 http_request测试报告 的html格式测试报告啦,可以在浏览器里预览噢~
是不是还是挺好看滴~
来源:oschina
链接:https://my.oschina.net/u/4292207/blog/3601193