0


python unittest基本用法

unittest是python单元测试框架,类似于JUnit框架

意义:

  1. 灵活的组织ui接口测试自动化用例
  2. 让用例高效的执行
  3. 方便验证测试用例的结果
  4. 集成html形式测试报告
  1. 一个class继承unittest.TestCase类,即是一个个具体的TestCase(类方法名称必须以test开头,否则不能被unittest识别)
  2. 每一个用例执行的结果的标识,成功是. ,失败为F,出错是E
  3. 每一个测试以test01、test02…依次写下去,unittest才可按照编号执行
  4. versity参数控制输出结果,0是简单报告、1是一般报告、2是详情报告。
  5. 用setUp()、terUpClass()以及tearDownClass()可以在用例执行前布置环境,以及在用例执行后清理环境。
  6. 参数中加stream,可以讲报告输出到文件:可以用HTMLTestRunner输出html报告。
  7. 多个单元的测试用例集合在一起,就是TestSuite。

案例1

  1. from selenium import webdriver
  2. import requests
  3. deftest01():'''
  4. 用例1
  5. :return:
  6. '''
  7. url ="http://www.ynhousedata.cn/house/assessment/assess_public?token=9a5008072cfd7336350306fdd9ea9485&timestamp=2022-04-22 09:20:33&layer=1&total_layer=8&total_area=120&pre_id=4450"
  8. re = requests.get(url)print(re.status_code, re.text, re.headers, re.encoding)deftest02():'''
  9. 用例1
  10. :return:
  11. '''
  12. driver = webdriver.Chrome()
  13. driver.get('https://www.baidu.com/')
  14. search =input('输入搜索内容\n')
  15. driver.find_element_by_xpath('//*[@id="kw"]').send_keys(search)
  16. driver.find_element_by_xpath('//*[@id="su"]').click()
  17. test01()
  18. test02()

以上测试,一旦test01出错,后边的代码无法执行,而且测试报告,不便于查阅。

  1. import unittest
  2. classTestCases(unittest.TestCase):@classmethoddefsetUpClass(cls)->None:print('所有用例的前置')@classmethoddeftearDownClass(cls)->None:print('所有用例的后置')defsetUp(self)->None:print('每个用例前置')deftearDown(self)->None:print('每个用例的后置')deftest01(self):print('执行用例1')deftest02(self):print('执行用例2')if __name__ =='__main__':
  3. unittest.main()

运行结果

  1. Ran 2 tests in0.001s
  2. OK
  3. 所有用例的前置
  4. 每个用例前置
  5. 执行用例1
  6. 每个用例的后置
  7. 每个用例前置
  8. 执行用例2
  9. 每个用例的后置
  10. 所有用例的后置
  11. Process finished with exit code 0

若某个类下用例非常多,但又只想执行某一个,可以用以下方法

  1. if __name__ =='__main__':# 创建套件对象
  2. suit = unittest.TestSuite()# 添加指定用例
  3. suit.addTest(TestCases("test02"))
  4. run = unittest.TextTestRunner()
  5. run.run(suit)

运行结果

  1. 所有用例的前置
  2. 每个用例前置
  3. 执行用例2
  4. 每个用例的后置
  5. .所有用例的后置
  6. ----------------------------------------------------------------------
  7. Ran 1testin0.000s
  8. OK
  9. <unittest.runner.TextTestResult run=1errors=0failures=0>

若某个类下用例非常多,以下运行方式可以执行多个用例

  1. if __name__ =='__main__':# 创建套件对象
  2. suit = unittest.TestSuite()# 添加指定用例,多条
  3. suit.addTests([TestCases("test01"), TestCases("test02")])
  4. run = unittest.TextTestRunner()
  5. run.run(suit)

运行结果

  1. 所有用例的前置
  2. 每个用例前置
  3. 执行用例1
  4. 每个用例的后置
  5. .每个用例前置
  6. 执行用例2
  7. 每个用例的后置
  8. .所有用例的后置
  9. ----------------------------------------------------------------------
  10. Ran 2 tests in0.000s
  11. OK
  12. <unittest.runner.TextTestResult run=2errors=0failures=0>

当一个py文件下有多个类,需要执行某个类的时候,可以用以下方法执行

  1. if __name__ == '__main__':
  2. # 创建套件对象
  3. suit = unittest.TestSuite()
  4. # 加载类
  5. load = unittest.TestLoader()
  6. suit.addTest(load.loadTestsFromTestCase(TestCases)) #TestCases为
  7. run = unittest.TextTestRunner()
  8. run.run(suit)

运行结果

  1. 所有用例的前置
  2. 每个用例前置
  3. 执行用例1
  4. 每个用例的后置
  5. .每个用例前置
  6. 执行用例2
  7. 每个用例的后置
  8. .所有用例的后置
  9. ----------------------------------------------------------------------
  10. Ran 2 tests in0.000s
  11. OK
  12. <unittest.runner.TextTestResult run=2errors=0failures=0>

当有多个测试类的时候,可以用以下方法执行

  1. from selenium import webdriver
  2. import requests
  3. import unittest
  4. classTestCases1(unittest.TestCase):@classmethoddefsetUpClass(cls)->None:print('所有用例的前置')@classmethoddeftearDownClass(cls)->None:print('所有用例的后置')defsetUp(self)->None:print('每个用例前置')deftearDown(self)->None:print('每个用例的后置')deftest01(self):print('执行用例1')deftest02(self):print('执行用例2')classTestCases2(unittest.TestCase):@classmethoddefsetUpClass(cls)->None:print('所有用例的前置')@classmethoddeftearDownClass(cls)->None:print('所有用例的后置')defsetUp(self)->None:print('每个用例前置')deftearDown(self)->None:print('每个用例的后置')deftest04(self):print('执行用例4')deftest03(self):print('执行用例3')if __name__ =='__main__':# 创建类加载对象
  5. load = unittest.TestLoader()# 分别加载两个类
  6. suit1 = load.loadTestsFromTestCase(TestCases1)
  7. suit2 = load.loadTestsFromTestCase(TestCases2)# 放在套件里
  8. suits = unittest.TestSuite([suit1, suit2])
  9. run = unittest.TextTestRunner()
  10. run.run(suits)

运行结果

  1. 所有用例的前置
  2. 每个用例前置
  3. 执行用例1
  4. 每个用例的后置
  5. .每个用例前置
  6. 执行用例2
  7. 每个用例的后置
  8. .所有用例的后置
  9. 所有用例的前置
  10. 每个用例前置
  11. 执行用例3
  12. 每个用例的后置
  13. .每个用例前置
  14. 执行用例4
  15. 每个用例的后置
  16. .所有用例的后置
  17. ----------------------------------------------------------------------
  18. Ran 4 tests in0.000s
  19. OK
  20. <unittest.runner.TextTestResult run=4errors=0failures=0>

当需要执行多个py文件下的类的用例的时候可以用以下方法

文件结构

  1. unitTest pwd
  2. /Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest,假设main.py执行testCase文件夹下的test*.py里的类
  3. unitTest tree
  4. .
  5. ├── unitTest.md
  6. ├── __init__.py
  7. ├── main.py
  8. └── testCase
  9. ├── test01.py
  10. └── test02.py
  11. 1 directory, 5 files

test01.py

  1. import unittest
  2. classTestCases1(unittest.TestCase):@classmethoddefsetUpClass(cls)->None:print('所有用例的前置')@classmethoddeftearDownClass(cls)->None:print('所有用例的后置')defsetUp(self)->None:print('每个用例前置')deftearDown(self)->None:print('每个用例的后置')deftest01(self):print('执行用例1')deftest02(self):print('执行用例2')

test02.py

  1. import unittest
  2. classTestCases2(unittest.TestCase):@classmethoddefsetUpClass(cls)->None:print('所有用例的前置')@classmethoddeftearDownClass(cls)->None:print('所有用例的后置')defsetUp(self)->None:print('每个用例前置')deftearDown(self)->None:print('每个用例的后置')deftest04(self):print('执行用例4')deftest03(self):print('执行用例3')

main.py

  1. # -*- coding: utf-8 -*-# @File : main.py# @Author : 李东# @Time : 2022/04/25 10:42:20import unittest
  2. test_dir ="/Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest"
  3. report_path =
  4. dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")# 创建套件
  5. suit = unittest.TestSuite()# 添加套件用例
  6. suit.addTest(dis)
  7. run = unittest.TextTestRunner()
  8. run.run(suit)

运行如下:

  1. 所有用例的前置
  2. 每个用例前置
  3. 执行用例1
  4. 每个用例的后置
  5. .每个用例前置
  6. 执行用例2
  7. 每个用例的后置
  8. .所有用例的后置
  9. 所有用例的前置
  10. 每个用例前置
  11. 执行用例3
  12. 每个用例的后置
  13. .每个用例前置
  14. 执行用例4
  15. 每个用例的后置
  16. .所有用例的后置
  17. ----------------------------------------------------------------------
  18. Ran 4 tests in0.000s
  19. OK
  20. <unittest.runner.TextTestResult run=4errors=0failures=0>

2、生成测试报告

  1. 进入网站,下载HTMLTestRunner文件 下载HTMLTestRunner链接下载HTMLTestRunner链接
  2. 下载后修改文件,建议全部修改,如果报错,将不需要修改的地方还原即可。
  1. 94行,import StringI0 ||| import io
  2. 118行,self.fp.write(s) ||| self.fp.write(bytes(s,'UTF-8'))
  3. 539行,self.outputBuffer = StringI0.StringI0() ||| self.outputBuffer = io.BytesI0()
  4. 631行,print >>sys .stderr, '\nTime ELapsed: %s' % (self.stopTime-seLf.startTime) ||| print('\nTime Elapsed: %s' % (self.stopTime-self.startTime))
  5. 642行,if not rmap.has_key(cls): ||| if not cls in rmap:
  6. 766行,uo = o.decode('latin-1') ||| uo = o
  7. 768行,uo = o ||| Uo = o.decode('utf-8')
  8. 772行,ue = e.decode('latin-1') ||| ue=e
  9. 774行,ue = e ||| ue = e.decode('utf-8')
  1. 修改完成之后,将文件放入到python环境的lib目录下(windows)。mac 用户可以放在****/lib/python3.9/site-packages目录下。
  2. 创建报告存放的文件夹report,报告目录结构如下
  3. main.py定义如下
  1. import unittest
  2. import HTMLTestRunner
  3. test_dir ="/Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest/testCase"# 报告存放的位置
  4. report_path ="/Users/lidong/Desktop/zhouyu/BILIBILI/笔记/unitTest/report/"# 打开目录,生成html文件file=open(report_path+'result.html','wb')# 文件格式生成
  5. run = HTMLTestRunner.HTMLTestRunner(stream=file, title='这是报告标题', description='这是报告描述')# 加载用
  6. dis = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")# 运行用例
  7. run.run(dis)

6、运行main.py之后,会在report目录下生成html报告
7、 使用浏览器打开,可以看到如下报告

断言基本操作

  1. import unittest
  2. import requests
  3. classTess(unittest.TestCase):defsetUp(self):
  4. res = requests.get('http://www.baidi.com')return res.status_code
  5. deftest1(self):# 判断获取的状态是否等于200
  6. self.assertEqual(self.setUp(),200)if __name__ =='__main__':
  7. unittest.main()

数据驱动 ddt data

  1. import unittest
  2. from ddt import ddt, data
  3. @ddtclassTestCases2(unittest.TestCase):@classmethoddefsetUpClass(cls)->None:print('所有用例的前置')@classmethoddeftearDownClass(cls)->None:print('所有用例的后置')defsetUp(self)->None:print('每个用例前置')deftearDown(self)->None:print('每个用例的后置')@data('username01','username02')deftest04(self, username):"""冒烟用例"""print('执行用例4,',username,'登陆成功')deftest03(self):"""爆炸用例"""print('执行用例3')if __name__ =='__main__':# 创建类加载对象
  4. load = unittest.TestLoader()# 分别加载两个类
  5. suit2 = load.loadTestsFromTestCase(TestCases2)# 放在套件里
  6. suits = unittest.TestSuite([suit2])
  7. run = unittest.TextTestRunner()
  8. run.run(suits)

运行结果

  1. 所有用例的前置
  2. 每个用例前置
  3. 执行用例3
  4. 每个用例的后置
  5. .每个用例前置
  6. 执行用例4 username01 登陆成功
  7. 每个用例的后置
  8. .每个用例前置
  9. 执行用例4 username02 登陆成功
  10. 每个用例的后置
  11. .所有用例的后置
  12. ----------------------------------------------------------------------
  13. Ran 3 tests in0.000s
  14. OK
  15. <unittest.runner.TextTestResult run=3errors=0failures=0>

巩固

  1. # -*- coding: utf-8 -*-,# @File : test_module.py,# @Author : lidong,# @IDEA: PyCharm# @Time : 2022/4/25 16:57import unittest
  2. classTestStringMethods(unittest.TestCase):
  3. a =67# 跳过被此装饰器装饰的测试。 reason 为测试被跳过的原因。@unittest.skip('取消测试')deftest_upper(self):print('test_upper')# 当condition为真时,跳过被装饰的测试。@unittest.skipIf(a>5,'取消测试')deftest_upper2(self):print('test_upper2')# 跳过被装饰的测试,condition 为假@unittest.skipUnless(a >88,'跳过被装饰的测试')deftest_upper3(self):print('test_upper3')deftest_upper5(self):
  4. self.assertEqual('foo'.upper(),'FOO')deftest_isupper(self):
  5. self.assertTrue('FOO'.isupper())
  6. self.assertFalse('Foo'.isupper())deftest_split(self):
  7. s ='hello world'
  8. self.assertEqual(s.split(),['hello','world'])# check that s.split fails when the separator is not a stringwith self.assertRaises(TypeError):
  9. s.split(2)if __name__ =='__main__':
  10. unittest.main()

运行

  1. ===============================================================================[SKIPPED]
  2. 取消测试
  3. unitTest.testCase.test_module.TestStringMethods.test_upper
  4. unitTest.testCase.test_module.TestStringMethods.test_upper2
  5. ===============================================================================[SKIPPED]
  6. 跳过被装饰的测试
  7. unitTest.testCase.test_module.TestStringMethods.test_upper3
  8. -------------------------------------------------------------------------------
  9. Ran 6 tests in0.093s
  10. PASSED (skips=3, successes=3)
  11. Process finished with exit code 0
  12. Skipped: 取消测试
  13. Skipped: 取消测试
  14. Skipped: 跳过被装饰的测试
标签: python 单元测试

本文转载自: https://blog.csdn.net/qq_43370607/article/details/124410107
版权归原作者 sky-开发 所有, 如有侵权,请联系我们删除。

“python unittest基本用法”的评论:

还没有评论