UnitTest
1. UnitTest
- UnitTest是python自带的自动化测试框架
- UnitTest主要包含的内容
TestCase(测试用例)
TestSuite(测试套件,把多个测试用例集成到一个测试套件)
TestRunner(执行测试用例)
TestLoader(自动从代码中加载多个测试用例)
1.1 TestCase
1.导包:import unittest
2.定义测试类:新建测试类必须继承unittest.TestCase
3.定义测试方法:测试方法名称必须以test开头
4.调用unittest.main()执行测试用例
#导包
import unittest
#定义一个方法,练习时使用
def my_sum(a,b):
return a + b
#定义测试类
class mytest(unittest.TestCase):
def test_001(self):
print(my_sum(5,6))
def test_002(self):
print(my_sum(0,3))
1.2 TestSuite
1.实例化:suite = unittest.Testsuite()
2.添加用例:suite.addTest(ClassName(“MethodName”))
3.添加扩展:suite.addTest(unittest.makeSuite(ClassName))
import unittest
import testfile
suite = unittest.TestSuite()
suite.addTest(testfile.mytest("test_001"))
suite.addTest(unittest.makeSuite(testfile.mytest02))
1.3 TextTestRunner
TestSuite需要配合TextTestRunner才能执行
TextTestRunner作用:执行在suite中的测试用例
实例化:runner = unittest.TextTestRunner() #实例化TextTestRunner的对象
执行:runner.run(suite) #调用对象的run方法
1.4 TestLoader
用来加载TestCase到TestSuite中,即加载满足条件的测试用例,将测试用例封装成测试套件。
使用unittest.TestLoader,通过该类下面的discover()方法自动搜索指定目录中指定开头的.py文件,并将查找到的测试用例组装到测试套件
suite = unittest.TestLoader().discover(test_dir,pattern='*test*.py')
#导包
import unittest
#用TestLoader对象的discover方法自动查找py,自动加载py文件中的方法
#第一个参数是从哪里找py文件,"."从当前目录开始查找py文件
#第二个参数是指定py文件的文件名,可以用通配符
suite = unittest.TestLoader().discover(".",pattern='my*.py')
runner = TextTestRunner()
runner.run()
2. FixTure
FixTure是一个概述,对一个测试用例环境的初始化和销毁就是一个Fixture
可以在测试用例执行之前自动调用指定的函数,在测试用例执行之后自动调用指定的函数
2.1 FixTure控制级别
- 方法级别:每个方法执行前和执行后都自动调用函数
- 类级别:不管类中有多少方法,一个类执行前后都自动调用函数
- 模块级别:不管一个模块中有多少类,模块执行前后都自动调用函数
2.1.1 方法级别
- 初始化(前置处理):def setUp(self) --> 首先自动执行
- 销毁(后置处理):def tearDown(self) --> 最后自动执行
运行于测试方法始末,即运行一次测试方法就会运行一个setUp和tearDown
import unittest
#定义测试类
class mytest(unittest.TestCase):
def setUp(self):
print("setUp被自动调用了")
def tearDown(self):
print("tearDown被自动调用了")
def test_001(self):
print(my_sum(5,6))
def test_002(self):
print(my_sum(0,3))
2.1.2 类级别
- 初始化(前置处理):@classmethod def setUpClass(cls) --> 首先自动执行
- 销毁(后置处理):@classmethod def tearDownClass(cls) --> 最后自动执行
运行于测试类始末,即运行一个类就会运行一个setUpClass和tearDownClass
#定义测试类
class mytest(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass被自动调用了")
@classmethod
def tearDownClass(cls):
print("tearDownClass被自动调用了")
def test_001(self):
print(my_sum(5,6))
def test_002(self):
print(my_sum(0,3))
2.1.3 模块级别
- 初始化(前置处理): def setUpModule() --> 首先自动执行
- 销毁(后置处理):def tearDownModule() --> 最后自动执行
运行于整个模块始末,即整个模块只会运行一次setUpModule和tearDownModule
def setUpModule():
print("setUpModule被自动调用了")
def tearDownModule():
print("tearDownModule被自动调用了")
3. 断言
assert…方法来自父类TestCase
#断言相等
self.assertEqual(num1,11)
#断言在列表中
self.assertIn(11,[12,23,11,26])
4. 参数化
通过参数化的方式来传递数据,从而实现数据与脚本分离。并且可以实现用例的重复执行。unittest测试框架,本身不支持参数化,但是可以通过安装unittest扩展插件parameterized来实现。
1.导包:from parameterized import parameterized
2.使用@parameterized.expand装饰器可以为测试函数的参数进行参数化
class mytest(unittest.TestCase):
@parameterized.expand([(1,1,2),(2,2,4),(3,3,5)])
def test_mysum(self,a,b,c):
assertEqual(my_sum(a,b),c)
5. 跳过执行
对于一些未完成的或者不满足测试条件的测试函数和测试类,可以跳过执行。
class mytest(unittest.TestCase):
@unittest.skip
def test_mysum(self):
assertEqual(num1,11)
6. 测试报告
生成测试报告的方式:
- TextTestRunner(unittest自带)
- HTMLTestRunner(第三方模板)
6.1 生成TextTestRunner测试报告
1.导入unittest包
2.生成测试套件
3.以只写方式打开测试报告文件f=open(“test01.txt”,“w”,encoding=“utf-8”)
4.实例化TextTestRunner对象:runner=unittest.TextTestRunner(stream=f,verbosity=2)
5.执行runner.run(suite)
6.关闭文件
import unittest
suite = unittest.TestLoader().discover('.','my*.py')
file = open('test01.txt','w',encoding='utf-8')
runner = unittest.TextTestRunner(stream=f,verbosity=2)
runner.run(suite)
file.close()
6.2 生成HTMLTestRunner测试报告
1.复制HTMLTestRunner.py到项目文件夹下
2.导入HTMLTestRunner、unittest包
3.生成测试套件 suite = unittest.TestLoader().discover(‘.’,‘my*.py’)
4.以只写方式打开测试报告文件f=open(“test01.html”,“w”,encoding=“utf-8”)
5.实例化HTMLTestRunner对象:runner=unittest.HTMLTestRunner(stream=f,title=“自动化测试报告”,description=“Chorme浏览器”)
6.执行runner.run(suite)
7.关闭文件
#导包
import unittest
import HTMLTestRunner
suite = unittest.TestLoader().discover('.','my*.py')
file = open('test01.html','wb')
runner = unittest.HTMLTestRunner(stream=f,title="自动化测试报告",description="Chorme浏览器")
runner.run(suite)
file.close()