1, 概念说明
1 unittest:python 中自带的单元测试框架, 封装了一些校验返回的结果方法和一些用例执行前的初始化操作
2 TestCase: 测试用例
3 TestSuite: 测试套, 即多个测试用例集合在一起
4 TestLoader: 用来加载 TestCase 到 TestSuite 中的
5 TestRunner: 执行测试用例的, 测试的结果会保存到 TestResult 实例中, 包括运行了多少测试用例, 成功了多少, 失败了多少等信息
2,unittest 模块说明
1)unittest 方法说明
1 unittest.TestCase:TestCase 类, 所有测试用例类继承的基本类
2 unittest.main():main() 方法使用 TestLoader 类来搜索所有包含在该模块中以 "test" 命名开
头的测试方法, 并自动执行他们. 执行方法的默认顺序是: 根据 ASCII 码的顺序加载测试
用例, 数字与字母的顺序为: 0-9,A-Z,a-z.
3 unittest.TestSuite(): 用来创建测试套件的.
4 unittest.TextTextRunner(): 通过该类下面的 run() 方法来运行 suite 所组装的测试用例, 入参
为 suite 测试套件.
5 unittest.defaultTestLoader(): 通过该类下面的 discover() 方法可自动根具测试目录 start_dir
匹配查找测试用例文件 (test*.py), 并将查找到的测试用例组装到测试套件, 因此可以直
接通过 run() 方法执行 discover. 用法如下:
discover=unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py')
6 unittest.skip(): 可用装饰器屏蔽不想执行的用例
@unittest.skip(reason): skip(reason) 装饰器: 无条件跳过装饰的测试, 并说明跳过测试的原因.
@unittest.skipIf(reason): skipIf(condition,reason) 装饰器: 条件为真时, 跳过装饰的测试, 并说明跳过测试的原因.
@unittest.skipUnless(reason): skipUnless(condition,reason) 装饰器: 条件为假时, 跳过装饰的测试, 并说明跳过测试的原因.
@unittest.expectedFailure(): expectedFailure() 测试标记为失败.
2)TestCase 类的方法说明
1 setUp(): 用于测试用例执行前的初始化工作.
2 tearDown(): 用于测试用例执行之后的善后工作. 如关闭数据库连接, 关闭浏览器.
3 assert*(): 断言, 实际结果和预期结果是否相等
assertEqual(a,b,[msg='失败时打印的信息']): 断言 a,b 是否相等, 相等则用例通过.
assertNotEqual(a,b,[msg='失败时打印的信息']): 断言 a,b 是否相等, 不相等则试用例通过.
assertTrue(x,[msg='失败时打印的信息']): 断言 x 是否 True, 是 True 则用例通过.
assertFalse(x,[msg='失败时打印的信息']): 断言 x 是否 False, 是 False 则用例通过.
assertIs(a,b,[msg='失败时打印的信息']): 断言 a 是否是 b, 是则用例通过.
assertNotIs(a,b,[msg='失败时打印的信息']): 断言 a 是否是 b, 不是则用例通过.
assertIsNone(x,[msg='失败时打印的信息']): 断言 x 是否 None, 是 None 则用例通过.
assertIsNotNone(x,[msg='失败时打印的信息']): 断言 x 是否 None, 不是 None 则用例通过.
assertIn(a,b,[msg='失败时打印的信息']): 断言 a 是否在 b 中, 在 b 中则用例通过.
assertNotIn(a,b,[msg='失败时打印的信息']): 断言 a 是否在 b 中, 不在 b 中则用例通过.
assertIsInstance(a,b,[msg='失败时打印的信息']): 断言 a 是 b 的一个实例, 是则用例通过.
assertNotIsInstance(a,b,[msg='失败打印的信息']): 断言 a 不是 b 的一个实例, 不是则用例过.
3)TestSuite 类的方法 (组织用例时需要用到)
1addTest(): 将测试用例添加到测试套件中, 如下
- suite = unittest.TestSuite()
- suite.addTest(test_baidu.BaiduTest('test_baidu'))
4)TextTextRunner 的方法 (组织用例时需要用到)
1run(): 运行测试套件的测试用例, 入参为 suite 测试套件, 如下
- runner = unittest.TextTestRunner()
- runner.run(suite)
3,unitest 简单使用
- # coding=utf-8
- import unittest
- # 创建测试类, 继承 unittest.TestCase
- class TestMethod(unittest.TestCase):
- # 类方法: 整个测试中只会执行一次, 类方法需要一个注解 @classmethod, 且方法名称需要固定为 setUpClass,tearDownClass
- @classmethod
- def setUpClass(cls):
- print '类执行之前的方法'
- @classmethod
- def tearDownClass(cls):
- print '类执行之后的方法'
- # 每次方法之前执行
- def setUp(self):
- print 'test-->setUp'
- # 每次方法之后执行
- def tearDown(self):
- print 'test-->tearDown'
- # 注意所有的 case 都要以 test 开头, 如果不以 test 开头, 那么你的 case 无法执行
- def test_01(self):
- print 'test-->testCase-1'
- def test_02(self):
- print 'test-->testCase-2'
- # 执行
- if __name__ == '__main__':
- unittest.main()
执行结果如下
4,unittest 和 request 重构封装
1) 定义两个接口, 分别为 get,post
- # get 接口数据处理
- def dadaHandle_get(request):
- if request.method == 'GET':
- results = {}
- username = request.GET.get('username')
- mobile = request.GET.get('mobile')
- data = request.GET.get('data')
- results['user'] = username
- results['mobileNum'] = mobile
- results['data']= data
- results =JSON.dumps(results)
- return HttpResponse(results,content_type='application/json;charset=utf-8')
- else:
- return render_to_response('login.html')
- # post 接口数据处理
- def dadaHandle_post(request):
- if request.method == 'POST':
- results = {}
- username = request.POST.get('username')
- password = request.POST.get('password')
- results['user'] = username
- results['pwd'] = password
- results =JSON.dumps(results)
- return HttpResponse(results,content_type='application/json;charset=utf-8')
- else:
- return render_to_response('login.html')
2)requests 封装方法处理 get,post 请求
- # coding=utf-8
- import requests
- import JSON
- class SendMain:
- # 发送 post 请求
- def send_post(self,url, data):
- res = requests.post(url=url, data=data).JSON()
- # 返回结果格式化
- return JSON.dumps(res, indent=2, sort_keys=True)
- # 发送 get 请求
- def send_get(self,url, data):
- res = requests.get(url, data).JSON()
- # 返回结果格式化
- return JSON.dumps(res, indent=2, sort_keys=True)
- # 既能发 get 又能发 post 请求
- def send_main(self,url, method, data=None):
- res = None
- if method == 'GET':
- res = self.send_get(url, data)
- else:
- res = self.send_post(url, data)
- return res
3)unittest 结合 requests 处理 get,post
- # coding=utf-8
- import unittest
- from base.requestsDemo import SendMain
- # 创建测试类, 继承 unittest.TestCase
- class TestMethod(unittest.TestCase):
- # 每次方法之前执行
- def setUp(self):
- self.run = SendMain()
- # 注意所有的 case 都要以 test 开头, 如果不以 test 开头, 那么你的 case 无法执行
- def test_01(self):
- postData = {'username': 'wangling', 'password': '123456'}
- postUrl = 'http://127.0.0.1:8000/postDataHandle/'
- res = self.run.send_main(postUrl,'POST',postData)
- print res
- def test_02(self):
- getData = {'username': 'wl', 'mobile': '13066990001', 'data': 'haha'}
- getUrl = 'http://127.0.0.1:8000/getDataHandle'
- res = self.run.send_main(getUrl,'GET',getData)
- print res
- # 执行
- if __name__ == '__main__':
- unittest.main()
来源: https://www.cnblogs.com/santiandayu/p/9985848.html