unittest和requests重构、封装处理get/post请求
unittest和requests重构、封装处理get/post请求
1、概念说明
① unittest:python中自带的单元测试框架,封装了一些校验返回的结果方法和一些用例执行前的初始化操作
② TestCase:测试用例
③ TestSuite:测试套,即多个测试用例集合在一起
④ TestLoader:用来加载TestCase到TestSuite中的
⑤ TestRunner:执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
2、unittest模块说明
1)unittest方法说明
① unittest.TestCase:TestCase类,所有测试用例类继承的基本类
② unittest.main():main()方法使用TestLoader类来搜索所有包含在该模块中以“test”命名开
头的测试方法,并自动执行他们。执行方法的默认顺序是:根据ASCII码的顺序加载测试
用例,数字与字母的顺序为:0-9,A-Z,a-z。
③ unittest.TestSuite():用来创建测试套件的。
④ unittest.TextTextRunner():通过该类下面的run()方法来运行suite所组装的测试用例,入参
为suite测试套件。
⑤ unittest.defaultTestLoader(): 通过该类下面的discover()方法可自动根具测试目录start_dir
匹配查找测试用例文件(test*.py),并将查找到的测试用例组装到测试套件,因此可以直
接通过run()方法执行discover。用法如下:
discover=unittest.defaultTestLoader.discover(test_dir, pattern=’test_*.py’)
⑥ unittest.skip():可用装饰器屏蔽不想执行的用例
@unittest.skip(reason): skip(reason)装饰器:无条件跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipIf(reason): skipIf(condition,reason)装饰器:条件为真时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.skipUnless(reason): skipUnless(condition,reason)装饰器:条件为假时,跳过装饰的测试,并说明跳过测试的原因。
@unittest.expectedFailure(): expectedFailure()测试标记为失败。
2)TestCase类的方法说明
① setUp():用于测试用例执行前的初始化工作。
② tearDown():用于测试用例执行之后的善后工作。如关闭数据库连接,关闭浏览器。
③ 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类的方法(组织用例时需要用到)
①addTest(): 将测试用例添加到测试套件中,如下
suite = unittest.TestSuite()
suite.addTest(test_baidu.BaiduTest(‘test_baidu’))
4.TextTextRunner的方法(组织用例时需要用到)
①run(): 运行测试套件的测试用例,入参为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()