Selenium实战(四)——unittest单元测试2(断言方法+discover()多测试用例的执行)
一、断言方法
方法 |
检查 | 版本 |
assertEqual(a,b) | a==b | |
assertNotEqual(a,b) | a!=b | |
assertTrue(x) | bool(x) is True | |
assertFalse(x) | bool(x) is False | |
assertIs(a,b) | a is b | 3.1 |
assertIsNot(a,b) | a is not b | 3.1 |
assertIsNone(x) | x is None | 3.1 |
assertIsNotNone(x) | x is not None | 3.1 |
assertIn(a,b) | a in b | 3.1 |
assertNotIn(a,b) | a not in b | 3.1 |
assertIsInstance(a,b) | isinstance(a,b) | 3.2 |
assertNotIsInstance(a,b) | not isinstance(a,b) | 3.2 |
1 import unittest 2 3 4 class TestAssert(unittest.TestCase): 5 6 def test_equal(self): 7 self.assertEqual(2+2, 4) 8 self.assertEqual("python", "python") 9 self.assertNotEqual("hello", "python") 10 11 def test_in(self): 12 self.assertIn("hello", "hello world") 13 self.assertNotIn("hi", "hello") 14 15 def test_true(self): 16 self.assertTrue(True) 17 self.assertFalse(False) 18 19 20 if __name__ == '__main__': 21 unittest.main()
二、测试用例的组织与discover()方法
要执行多个不同文件下的测试用例,可以使用unittest中的TestLoader类提供的discover()方法查找要用到的测试用例。该类根据各种标准加载测试用例,并将它们返回给测试套件。正常情况下,不需要创建这个类的实例。unittest提供了可以共享的defaultTestLoader类,可以使用其子类或方法创建实例,discover()方法就是其中之一。
discover(start_dir, pattern='test*.py', top_level_dir=None)
找到指定目录及其子目录下的所有测试模块,只有匹配的文件名才能被加载。如果启动的不是顶层目录,那么顶层目录必须单独指定。
- start_dir:待测试的模块名或测试用例目录。
- pattern='test*.py':测试用例文件名的匹配原则。
- top_level_dir=None:测试模块的顶层目录,如果没有顶层目录,则默认为None
一个单元测试的文件目录如下:
两个不相关的判断闰年功能(leap_year.py)和计算器功能(calculator.py)的代码文件分别对应两个测试文件,calculator.py:
1 # 计算器类 2 class Calculator: 3 def __init__(self, a, b): 4 self.a = int(a) 5 self.b = int(b) 6 7 def add(self): 8 return self.a + self.b 9 10 def sub(self): 11 return self.a - self.b 12 13 def mul(self): 14 return self.a * self.b 15 16 def div(self): 17 return self.a / self.b
test_calculator.py文件:
1 import unittest 2 3 4 class TestAssert(unittest.TestCase): 5 6 def test_equal(self): 7 self.assertEqual(2+2, 4) 8 self.assertEqual("python", "python") 9 self.assertNotEqual("hello", "python") 10 11 def test_in(self): 12 self.assertIn("hello", "hello world") 13 self.assertNotIn("hi", "hello") 14 15 def test_true(self): 16 self.assertTrue(True) 17 self.assertFalse(False) 18 19 20 if __name__ == '__main__': 21 unittest.main()
leap_year.py文件:
1 class LeapYear: 2 3 def __init__(self, year): 4 self.year = int(year) 5 6 def answer(self): 7 year = self.year 8 if year % 100 == 0: 9 if year % 400 == 0: 10 # 整百年能被400整除的是闰年 11 return "{0}是闰年".format(year) 12 else: 13 return "{0}不是闰年".format(year) 14 else: 15 if year % 4 == 0: 16 # 非整百年能被4整除的是闰年 17 return "{0}是闰年".format(year) 18 else: 19 return "{0}不是闰年".format(year)
test_leap_year.py文件:
1 import unittest 2 3 from files.unit_test.leap_year import LeapYear 4 5 6 class TestLeapYear(unittest.TestCase): 7 def test_2000(self): 8 ly = LeapYear(2000) 9 self.assertEqual(ly.answer(), "2000是闰年") 10 11 def test_2004(self): 12 ly = LeapYear(2004) 13 self.assertEqual(ly.answer(), "2004是闰年") 14 15 def test_2017(self): 16 ly = LeapYear(2017) 17 self.assertEqual(ly.answer(), "2017不是闰年") 18 19 def test_2100(self): 20 ly = LeapYear(2100) 21 self.assertEqual(ly.answer(), "2100不是闰年") 22 23 24 if __name__ == '__main__': 25 unittest.main()
最后,用一个执行文件对这两个测试文件进行执行run_tests.py文件:
1 import unittest 2 3 # 定义测试用例的目录为当前目录中的unit_test 4 test_dir = './' 5 suits = unittest.defaultTestLoader.discover(test_dir, pattern='test*.py') 6 if __name__ == '__main__': 7 runner = unittest.TextTestRunner() 8 runner.run(suits)
discover()方法会自动根据测试用例目录(unit_test下)查找测试用例文件(test*.py),并将找到的测试用例添加到测试套件中,因此,可以直接通过run()方法执行测试套件suits.这种方式极大地简化了测试用例的查找,我们需要做的是按照文件的匹配规则创建测试文件即可。