python之unittest单元测试
现有一个自行封装的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格式测试报告啦,可以在浏览器里预览噢~
是不是还是挺好看滴~