Python单元测试框架unittest

[复制链接]
发表于 2022-12-20 02:13:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

1)写用例 TestCase
2)执行用例 1:TestSuite存储用例,2:TestLoader找用例,存储用例,存放指定的TestSuite
3)对比实际结果/期望结果,判定用例是否通过#断言Assert
4)出局测试报告TextTestRunner
测试类
  1. import requests
  2. class HttpRequest():
  3.     def __init__(self, method, url, param=None, headers=None, cookie=None):
  4.         self.method=method#method:请求方式
  5.         self.url=url#url:请求的url
  6.         self.param=param#param:请求参数
  7.         self.headers=headers#headers:请求头
  8.         self.cookie=cookie#cookie:请求的cookie值
  9.     def http_request(self):
  10.         if self.method.lower()=="post":
  11.             return requests.post(self.url,self.param)
  12.         elif self.method.lower()=="get":
  13.             return requests.get(self.url,self.param,headers=self.headers,cookies=self.cookie)
  14.         else:
  15.             print("请求方式错误:{0}".format(self.method))
复制代码
测试用例类:(写用例 TestCase)/断言/异常处理
  1. import unittest#引入unittest框架
  2. from test01.qabujiaban_class import HttpRequest#引入测试类
  3. #编写一个存储测试用例的类
  4. class TestHttp(unittest.TestCase):#用例类继承unittest.TestCase用于编写测试用例
  5.     #正确登陆测试用例
  6.     def test_login_yes(self):#测试用例函数必须test_开头,否则框架无法识别当前是用例
  7.         login_url = "http://www.qabujiaban.com/user/login"
  8.         data = {"username": "uuuu222都44", "password": "WJHasb124*1"}
  9.         res = HttpRequest("Post", login_url, data).http_request()
  10.         print("登陆响应文本:", res.json())  #
  11.         try:
  12.             self.assertEqual("0000", res.json()["code"])  # 断言,期望值==实际值
  13.         except AssertionError as e:
  14.             print("断言错误异常抛出:{0}".format(e))
  15.             raise e#抛出异常
  16.             #错误登陆测试用例
  17.     def test_login_no(self):
  18.         login_url = "http://www.qabujiaban.com/user/login"
  19.         data = {"username": "uuuu222都44", "password": "123456"}#密码错误
  20.         res = HttpRequest("Post", login_url, data).http_request()
  21.         print("登陆响应文本:", res.json())  #
  22.         try:
  23.             self.assertEqual("0000", res.json()["code"])  # 断言,期望值==实际值
  24.         except AssertionError as e:
  25.             print("断言错误异常抛出:{0}".format(e))
  26.             raise e#抛出异常
  27. if __name__ == '__main__':
  28.     unittest.main()#执行全部测试用例<br>
复制代码
  1. 执行结果:
  2. ============================= test session starts =============================
  3. platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0
  4. rootdir: C:\Users\Administrator\PycharmProjects\demo\test01
  5. plugins: html-3.2.0, metadata-2.0.4collected 2 items
  6. testdemo01.py                                                          [100%]
  7. ============================== 2 passed in 0.35s ==============================
  8. Process finished with exit code 0
  9. .登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
  10. .登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-59-19 11:12:04', 'create_time': '2021-23-28 04:12:19'}
复制代码
  1. 注意:
  2. 执行结果中,E表示错误,F表示失败,  .  点表示成功
复制代码
加载指定测试用例unittest.addTest()
  1. import unittest
  2. from test01.demo_case import TestHttp#引入测试用例类
  3. suite = unittest.TestSuite()#存储器,存储用例
  4. #第一个用例
  5. suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
  6. #第二个用例
  7. suite.addTest(TestHttp("test_login_no"))
  8. runner = unittest.TextTestRunner()
  9. runner.run(suite)#执行<br>
复制代码
  1. 执行结果:
  2. .登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-12-20 12:12:33', 'create_time': '2021-23-28 04:12:19'}
  3. 登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
  4. .
  5. ----------------------------------------------------------------------
  6. Ran 2 tests in 0.275s
  7. OK
  8. Process finished with exit code 0
复制代码
加载器通过类名进行加载loader.loadTestsFromTestCase()
  1. import unittest
  2. from test01.demo_case import TestHttp#引入测试用例类
  3. suite = unittest.TestSuite()#存储器,存储用例
  4. # #第一个用例
  5. # suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
  6. # #第二个用例
  7. # suite.addTest(TestHttp("test_login_no"))
  8. loader = unittest.TestLoader()#创建加载器
  9. suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载
  10. runner = unittest.TextTestRunner()
  11. runner.run(suite)#执行<br>
复制代码
  1. 执行结果:
  2. 登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
  3. ..
  4. 登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-23-20 12:12:16', 'create_time': '2021-23-28 04:12:19'}
  5. ----------------------------------------------------------------------
  6. Ran 2 tests in 0.288s
  7. OK
  8. Process finished with exit code 0
复制代码
 通过模块名加载用例loader.loadTestFromModule()
  1. import unittest
  2. # from test01.demo_case import TestHttp#引入测试用例类
  3. from test01 import demo_case#引入模块
  4. suite = unittest.TestSuite()#存储器,存储用例
  5. # #第一个用例
  6. # suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
  7. # #第二个用例
  8. # suite.addTest(TestHttp("test_login_no"))
  9. loader = unittest.TestLoader()#创建加载器
  10. # suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载
  11. suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载
  12. runner = unittest.TextTestRunner()
  13. runner.run(suite)#执行<br>
复制代码
  1. 执行结果:
  2. .登陆响应文本: {'code': '0002', 'message': '登陆失败,密码错误'}
  3. .
  4. ----------------------------------------------------------------------
  5. Ran 2 tests in 0.259s
  6. OK
  7. 登陆响应文本: {'code': '0000', 'message': '登陆成功', 'login_time': '2022-26-20 12:12:51', 'create_time': '2021-23-28 04:12:19'}
  8. Process finished with exit code 0
复制代码
出具测试报告TextTestRunner()
  1. import unittest
  2. # from test01.demo_case import TestHttp#引入测试用例类
  3. from test01 import demo_case
  4. suite = unittest.TestSuite()#存储器,存储用例
  5. # #第一个用例
  6. # suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
  7. # #第二个用例
  8. # suite.addTest(TestHttp("test_login_no"))
  9. loader = unittest.TestLoader()#创建加载器
  10. # suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载
  11. suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载
  12. file = open(file="log.txt",mode="w",encoding="utf8")
  13. runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream为日志日志存储路径,verbosity=0/1/2 打印日志日志的详细等级,2最详细
  14. runner.run(suite)#执行
  15. file.close()#关闭资源<br><br>执行结果:<br>
复制代码
上下文管理器 with open()
  1. import unittest
  2. # from test01.demo_case import TestHttp#引入测试用例类
  3. from test01 import demo_case
  4. suite = unittest.TestSuite()#存储器,存储用例
  5. # #第一个用例
  6. # suite.addTest(TestHttp("test_login_yes"))#添加要执行的用例
  7. # #第二个用例
  8. # suite.addTest(TestHttp("test_login_no"))
  9. loader = unittest.TestLoader()#创建加载器
  10. # suite.addTest(loader.loadTestsFromTestCase(TestHttp))#通过类名加载
  11. suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载
  12. with open(file="log.txt",mode="w",encoding="utf8") as file:#执行完后自动关闭
  13.     runner = unittest.TextTestRunner(stream=file,verbosity=2)#stream为日志日志存储路径,verbosity=0/1/2 打印日志的详细等级,2最详细
  14.     runner.run(suite)#执行
  15. #print(file.closed)#判断状态,True=关闭<br>
复制代码
  1. 执行结果与open()一致
复制代码
HTMLTestRunnerNew报告
  1. import unittest
  2. import HTMLTestRunnerNew#引入模板类
  3. # from test01.demo_case import TestHttp#引入测试用例类
  4. from test01 import demo_case
  5. suite = unittest.TestSuite()#存储器,存储用例
  6. loader = unittest.TestLoader()#创建加载器
  7. suite.addTest(loader.loadTestsFromModule(demo_case))#通过类名加载
  8. with open(file="qabujiaban_report.html",mode="wb") as file:#执行完后自动关闭
  9.     runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2,title="这里是标题",description="这里写描述",tester="这里写谁测试的")
  10.     runner.run(suite)<br><br>生成报告:<br>
复制代码
夹心饼干 setUp()  &  tearDown()
  1. import unittest#引入unittest框架
  2. from test01.qabujiaban_class import HttpRequest#引入测试类
  3. #编写一个存储测试用例的类
  4. class TestHttp(unittest.TestCase):#用例类继承unittest.TestCase用于编写测试用例
  5.     def setUp(self) -> None:
  6.         print("每一条用例执行前执行...")
  7.     def tearDown(self) -> None:
  8.         print("每一条用例执行结束后执行...(一般放到用例之后)")
  9.     #正确登陆测试用例
  10.     def test_login_yes(self):#测试用例函数必须test_开头,否则框架无法识别当前是用例
  11.         print("执行用例11111111111111111")
  12.     def test_login_no(self):
  13.         print("执行用例22222222222222222")
  14. if __name__ == '__main__':
  15.     unittest.main()#执行全部测试用例<br><br>执行结果:<br>
复制代码
  1. ============================= test session starts =============================
  2. platform win32 -- Python 3.7.3, pytest-7.2.0, pluggy-1.0.0
  3. plugins: html-3.2.0, metadata-2.0.4collected 2 items
  4. demo_case.py .每一条用例执行前执行...
  5. 执行用例22222222222222222
  6. 每一条用例执行结束后执行...(一般放到用例之后)
  7. .每一条用例执行前执行...
  8. 执行用例11111111111111111
  9. 每一条用例执行结束后执行...(一般放到用例之后)
  10.                                                           [100%]
  11. ============================== 2 passed in 0.10s ==============================
  12. Process finished with exit code 0
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表