- Python+selenium 【第七章】Unittest学习
unittest是python内置的单元测试框架,具备编写用例、组织用例、执行用例、功能,可以结合selenium进行UI自动化测试,也可以结合appium、requests等模块做其它自动化测试。
使用unittest前需要熟悉该框架的五个概念:
testcase,testsuite,testLoader,testrunner,testfixture。
- testcase:一个完整的测试单元,执行该测试单元可以完成对某一个问题的验证,完整体现在测试前环境准备(setUp),执行测试代码(run),以及测试后环境还原(tearDown);
- testsuite:多个测试用例的集合,测试套件或测试计划;
- testLoader:加载TestCase到TestSuite中的,其中loadTestsFrom__()方法用于寻找TestCase,并创建它们的实例,然后添加到TestSuite中,返回TestSuite实例;
- testrunner:执行测试用例,并将测试结果保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息;
- testfixture:一个测试用例的初始化准备及环境还原,主要是setUp()和setDown()方法
unittest基本使用步骤:
- a)用import语句引入unittest模块
- b)让所有执行测试的类都继承于TestCase类,可以将TestCase看成是对特定类进行测试的方法的集合
- c)setUp()方法中进行测试前的初始化工作,teardown()方法中执行测试后的清除工作,它们都是TestCase中的方法
- d)编写测试的方法最好以test开头(可以直接运行)deftest_add(self)、deftest_sub(self)等,可以编写多个测试用例对被测对象进行测试
- e)在编写测试方法过程中,使用TestCaseclass提供的方法测试功能点,比如:assertEqual等
- f)调用unittest.main()方法运行所有以test开头的方法
unittest常用断言介绍:
断言即进行预期结果和实际结果比对。
assertEqual(a,b) a==b #是否相等
assertNotEqual(a,b) a!=b #是否不相等
assertTrue(x) bool(x) is True #是否为True
assertFalse(x) bool(x) is False #是否为False
assertIn(a,b) a in b #是否包含
assertGreater(a,b) a>b #大于
assertGreaterEqual(a,b) a >= b #大于等于
assertLess(a,b) a<b#小于
assertLessEqual(a,b) a<=b #小于等于
可以在断言最后一个参数中加入自定义的测试失败信息,如:
assertEqual(10,20,”10!=20测试失败”) 当断言失败时,显示该消息。
- 代码示例
- unittest_demo_14.py
# -*- coding: utf-8 -*- # @Time : 2021/12/30 14:24 # @Author : Limusen # @File : unittest_demo_14 import unittest class TestCase01(unittest.TestCase): def setUp(self) -> None: print("执行前置") def tearDown(self) -> None: print("执行后置信息") def test_case01(self): '''加法''' self.assertEqual(1 + 2, 3) def test_case02(self): self.assertEqual(1 + 2, 2) if __name__ == "__main__": TestCase01().test_case01()
- 代码示例
unittest_demo_15.py
# -*- coding: utf-8 -*- # @Time : 2021/12/30 14:35 # @Author : Limusen # @File : unittest_demo_15 # 断言练习 import time import unittest class TestCase02(unittest.TestCase): def setUp(self) -> None: # print("执行前置") pass def tearDown(self) -> None: # print("执行后置信息") pass def test_case01(self): a = 1 == 1 self.assertTrue(a, '断言失败,不是True') # def test_case02(self): # a =1 ==3 # self.assertTrue(a,'断言失败,不是True') def test_case03(self): str = "你有梦想吗" self.assertTrue(str.__contains__("梦想")) def test_case04(self): name = ['张三', '李四', '王五'] self.assertIn('李四', name) print("范围测试") def test_case05(self): self.assertIsInstance('lishou', str) print("类型判定") if __name__ == "__main__": unittest.main()
- 改变代码执行顺序
demo_unittest_15.py
# -*- coding: utf-8 -*- # @Time : 2021/12/30 14:35 # @Author : Limusen # @File : unittest_demo_15 import unittest class TestCase03(unittest.TestCase): def test_case01_aaa(self): print("执行用例:test_aaa") def test_case02_ddd(self): print("执行用例:test_ddd") def test_case03_ccc(self): print("执行用例:test_ccc") def test_case04_bbb(self): print("执行用例:test_bbb") if __name__ == "__main__": # unittest.main() # # 改变执行顺序方法 # suite = unittest.TestSuite() # suite.addTest(TestCase03('test_bbb')) # suite.addTest(TestCase03('test_ccc')) # unittest.main(defaultTest='suite') pass # 改名字 test_case04_bbb unittest.main()
- 是否跳过用例
# -*- coding: utf-8 -*- # @Time : 2021/12/30 14:35 # @Author : Limusen # @File : unittest_demo_15 import unittest class TestCase04(unittest.TestCase): def test_case01(self): print("正在运算test_case01") self.assertEqual(3 + 4, 7, "求和失败") @unittest.skip("无条件跳过") def test_case02(self): print("正在运算test_case02") self.assertEqual(4 + 4, 8, "求和失败") @unittest.skipIf(True, '条件为真跳过') def test_case03(self): print("正在运算test_case03") self.assertEqual(4 + 4, 8, "求和失败") @unittest.skipIf(False, '条件为假不跳过') def test_case04(self): print("正在运算test_case04") self.assertEqual(4 + 4, 9, "求和失败") @unittest.skipUnless(False, '条件为假跳过') def test_case05(self): print("正在运算test_case05") self.assertEqual(4 + 4, 9, "求和失败") @unittest.expectedFailure # 失败不记录失败数量 def test_case06(self): print("正在运算test_case06") self.assertEqual(4 + 4, 9, "求和失败") @unittest.expectedFailure def test_case07(self): print("正在运算test_case07") self.assertEqual(4 + 4, 9, "求和失败") if __name__ == "__main__": unittest.main()
- 收集用例进行运行
# -*- coding: utf-8 -*- # @Time : 2021/12/30 14:35 # @Author : Limusen # @File : unittest_demo_15 import unittest class TestCase05(unittest.TestCase): def test_case01(self): print("正在运算test_case01") self.assertEqual(3 + 4, 7, "求和失败") @unittest.skip("无条件跳过") def test_case02(self): print("正在运算test_case02") self.assertEqual(4 + 4, 8, "求和失败") @unittest.skipIf(True, '条件为真跳过') def test_case03(self): print("正在运算test_case03") self.assertEqual(4 + 4, 8, "求和失败") @unittest.skipIf(False, '条件为假不跳过') def test_case04(self): print("正在运算test_case04") self.assertEqual(4 + 4, 9, "求和失败") @unittest.skipUnless(False, '条件为假跳过') def test_case05(self): print("正在运算test_case05") self.assertEqual(4 + 4, 9, "求和失败") @unittest.expectedFailure # 失败不记录失败数量 def test_case06(self): print("正在运算test_case06") self.assertEqual(4 + 4, 9, "求和失败") @unittest.expectedFailure def test_case07(self): print("正在运算test_case07") self.assertEqual(4 + 4, 9, "求和失败") if __name__ == "__main__": testsuite = unittest.TestSuite(unittest.makeSuite(TestCase05)) unittest.main(defaultTest='testsuite')
- 执行
# -*- coding: utf-8 -*- # @Time : 2021/12/30 14:35 # @Author : Limusen # @File : unittest_demo_19 import unittest class TestCase06(unittest.TestCase): def test_case01(self): print("正在运算test_case01") self.assertEqual(3 + 4, 7, "求和失败") @unittest.skip("无条件跳过") def test_case02(self): '''无条件跳过''' print("正在运算test_case02") self.assertEqual(4 + 4, 8, "求和失败") @unittest.skipIf(True, '条件为真跳过') def test_case03(self): '''条件为真跳过''' print("正在运算test_case03") self.assertEqual(4 + 4, 8, "求和失败") # @unittest.skipIf(False, '条件为假不跳过') @unittest.skip("无条件跳过") def test_case04(self): '''无条件跳过''' print("正在运算test_case04") self.assertEqual(4 + 4, 9, "求和失败") @unittest.skipUnless(False, '条件为假跳过') def test_case05(self): '''条件为假跳过''' print("正在运算test_case05") self.assertEqual(4 + 4, 9, "求和失败") @unittest.expectedFailure # 失败不记录失败数量 def test_case06(self): print("正在运算test_case06") self.assertEqual(4 + 4, 9, "求和失败") @unittest.expectedFailure def test_case07(self): print("正在运算test_case07") self.assertEqual(4 + 4, 9, "求和失败") if __name__ == "__main__": # # 方法一:加载测试类下面的所有用例 # suite01 = unittest.TestLoader().loadTestsFromTestCase(TestCase06) # unittest.main(defaultTest='suite01') # # # 方法二:加载测试模块下面的所有用例 # # 先导入模块 自己 # suite02 = unittest.TestLoader().loadTestsFromModule(test_case6) # unittest.main(defaultTest="suite02") # # # 方法三:使用字符串的方式加载用例 # suite03 = unittest.TestLoader().loadTestsFromName('test_case6.TestCase06.test_case01') # # 整个模块 # suite04 = unittest.TestLoader().loadTestsFromName('test_case6.TestCase06') # suite05 = unittest.TestLoader().loadTestsFromName('test_case6') # # # 单个加载全部测试用例 # all_suite = unittest.TestSuite() # all_suite.addTests(suite01) # all_suite.addTests(suite02) # all_suite.addTests(suite03) # all_suite.addTests(suite04) # all_suite.addTests(suite05) pass