UnitTest框架
是Python自带的单元测试框架,也可以用来做自动化测试(管理和执行用例)
核心要素(组成):
1、TestCase(测试用例)
2、TestSuite(测试套件):打包TestCase
3、TestRunner(测试执行):执行Testsuite
4、TestLoader(测试加载):对TestSuite的补充,也是打包TestCase的
5、Fixture(测试夹具):一种代码结构,书写前置方法(执行用例之前的方法)和后置方法(执行用例之后的方法)
单个用例创建及执行
import unittest# 定义测试类(只要继承unittest.TestCase类,就是测试类) class TestDemo(unittest.TestCase):# 书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test01(self):print('测试方法一')def test02(self):print('测试方法二')# 执行 if __name__ == '__main__':unittest.main()
多个用例及执行
test_01.py
import unittest# 定义测试类(只要继承unittest.TestCase类,就是测试类) class TestDemo01(unittest.TestCase):# 书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test01(self):print('1-1')def test02(self):print('1-2')
test_02.py
import unittest# 定义测试类(只要继承unittest.TestCase类,就是测试类) class TestDemo02(unittest.TestCase):# 书写测试方法,方法中的代码就是真正用例代码,方法名必须以test开头def test01(self):print('2-1')def test02(self):print('2-2')
testSuite_Runner.py
import unittest from test_01 import TestDemo01 from test_02 import TestDemo02suite = unittest.TestSuite() # 实例化套件对象 # 方法一:往测试套件里添加测试类中的某一个测试方法 #suite.addTest(TestDemo01('test01')) # 套件对象.addTest(测试类名('测试方法名')) #suite.addTest(TestDemo01('test02')) # 套件对象.addTest(测试类名('测试方法名')) #suite.addTest(TestDemo02('test01')) # 套件对象.addTest(测试类名('测试方法名')) #suite.addTest(TestDemo02('test02')) # 套件对象.addTest(测试类名('测试方法名'))# 方法二:往测试套件里添加测试类下所有的测试方法 #suite.addTest(unittest.makeSuite(TestDemo01)) #suite.addTest(unittest.makeSuite(TestDemo02))# 方法三:用TestLoader发现所有案例,得到的是套件对象 suite = unittest.TestLoader().discover('.', 'test_*.py')runner = unittest.TextTestRunner() # 实例化执行对象 runner.run(suite) # 执行对象.run(套件对象)
fixture的使用
testCases.py
import unittestclass TestLogin(unittest.TestCase):# 前置类方法 @classmethod # 类方法,需要添加装饰器def setUpClass(cls):print('1.open brower')# 后置类方法 @classmethoddef tearDownClass(cls):print('9.close brower')# 前置方法def setUp(self):print('2.input url')print('3.click login')# 后置方法def tearDown(self):print('7.click logout')print('8.close url')def testLogin1(self):print('4.input user 1')print('5.input password 1')print('6.click login button')def testLogin2(self):print('4.input user 2')print('5.input password 2')print('6.click login button')if __name__ == '__main__':unittest.main()
testRunner.py
import unittestsuite = unittest.TestLoader().discover('.', 'testCases.py') unittest.TextTestRunner().run(suite)
# 执行结果如下
1.open brower # 前置类方法
2.input url # 前置方法
3.click login
4.input user 1
5.input password 1
6.click login button
7.click logout # 后置方法
8.close url
.2.input url # 前置方法
3.click login
4.input user 2
5.input password 2
6.click login button
7.click logout # 后置方法
8.close url
.9.close brower # 后置类方法
断言
tools.py
def add(a, b):return a + b
assert_case.py
import unittest from tools import addclass AssertCase(unittest.TestCase):def test01(self):## 测试类.assertEqual(预期结果,实际结果)self.assertEqual(2, add(1, 1))def test_assert_not_equal2(self):self.assertEqual(3, add(1, 2))def test_assert_in3(self):## 测试类.assertIn(预期结果,实际结果集) 预期结果在实际结果集里面self.assertIn(add(2, 3), [5, 6, 7])if __name__ == '__main__':unittest.main()
assert_runner.py
import unittest from assert_case import AssertCasesuite = unittest.TestSuite() suite.addTest(unittest.makeSuite(AssertCase))unittest.TextTestRunner().run(suite)
断言+参数化(paramterized需要提前用pip安装)
assert_case.py
import unittest import json from tools import add from parameterized import parameterized# data = [(2, 1, 1), (3, 1, 2), (4, 2, 2), (5, 3, 2)] # 方法一 将数据源直接写在Python文件中# 方法二 将数据源写在json文件中 with open('data.json', encoding='utf-8') as f:data = json.load(f) # [[2, 1, 1], [3, 1, 2], [4, 2, 2], [5, 3, 2]]class AssertCase(unittest.TestCase):@parameterized.expand(data) # 直接取数据源列表[(),()]def test01(self, excpect, a, b):### 测试类.assertEqual(预期结果,实际结果) self.assertEqual(excpect, add(a, b))if __name__ == '__main__':unittest.main()
assert_runner.py
#import unittest #from assert_case import AssertCase#suite = unittest.TestSuite() #suite.addTest(unittest.makeSuite(AssertCase))# unittest.TextTestRunner().run(suite)# 生成测试报告(替换下runner对象) import unittest from htmltestreport import HTMLTestReport from assert_case import AssertCasesuite = unittest.TestSuite() suite.addTest(unittest.makeSuite(AssertCase))HTMLTestReport('HTMLTestReport.html', 'TestRepoer', 'This is a test report.').run(suite)
跳过
import unittest v = 2class SkipCase(unittest.TestCase):@unittest.skip('暂时不想执行')def testCase01(self):print('test01')@unittest.skipIf(v >= 2, '版本大于等于2就不执行')def testCase02(self):print('test02')def testCase03(self):print('test03')if __name__ == '__main__':unittest.main()