最近为了分享自动化框架,帮助功能测试理解,整理了一下 unittest 单元测试框架
<>Unittest单元测试框架的构成
TestCase 编写用例
TestSuit 组织用例
TestRunner 执行用例
TestFixture 处理用例,SetUp -预处理,用例开始,TearTown清理数据,用例结尾
这是我们封装的计算函数 math_method.py 包含加法结果,乘法结果
class MathMethod: def __init__(self, a, b): self.a = a self.b = b def add(self)
: # 加法 return self.a + self.b def multi(self): # 乘法 return self.a * self.b
需要验证 加法和乘法用例,我们用到了unittest,怎么使用unittest呢?
1.如何定义测试用例
1.导包:import unittest
2.定义测试类:新建测试类必须继承unittest.TestCase
3.定义测试方法:测试方法名称命名必须以test开头
4.一个用例就是一个函数不能传参 ,只有self关键字
2.如何执行测试用例
方式一:使用pycharm在代码上点击鼠标右键,选择使用UnitTest运行
方式二:调用unittest.main()来运行
我们新键一个名为test_01.py 的文件,来编写MathMethod() 的测试用例
class TestMathMethod(unittest.TestCase): #继承了unittest里面的 def
test_add_two_positive(self): res = MathMethod(1, 1).add() print("1+1的结果是:", res)
self.assertEqual(2, res) def test_add_two_zero(self): res = MathMethod(0, 0).
add() print("0+0的结果是:", res) self.assertEqual(0, res) def test_add_two_negative(
self): res = MathMethod(-1, -2).add() print("-1+(-2)的结果是:", res) self.
assertEqual(-3, res) # 执行 if __name__ == '__main__': unittest.main()
经过执行运行结果,我们跑了3条用例,可我们发现执行顺序不是按照我们定义的用例来执行的,这是为什么呢?
用例执行顺序:按照ASCII顺序从小到大执行,a-z
TestFixure测试夹具
TestFixure有两种使用方式,一种是书写成普通方法的steup(),teardown(),这种在执行时,会每执行类中的一个测试方法,分别在执行前setup(),执行后teardown()。
另一种时书写成类的方法,使用@classmethod,setUpClass()和tearDownClass(),这这种在执行时,会先执行setupClass(),执行完类中所有的测试用例后,执行tearDownClass()中的方法。
class TestMathMethod(unittest.TestCase): #继承了unittest里面的 def setUp(self): #
step 执行每一条测试用例之前会执行setUp里面 print("我要开始执行用例了") def tearDown(self): #重写
#tearDown每一条用例执行完毕后执行 print("我已执行完毕用例了") #如果说 你有操作必须在执行用例之前 准备好 那就放到setUp
#如果说你有操作必须在执行用例之后要清除那就放到tearDown def test_add_two_positive(self): res =
MathMethod(1, 1).add() print("1+1的结果是:", res) # 加一个断言:判断期望值与实际值的比对结构 一致就算通过
不一致就算失败 self.assertEqual(2, res) def test_add_two_zero(self): res = MathMethod(0
, 0).add() print("0+0的结果是:", res) self.assertEqual(1, res, "出错了") #用例执行失败了才会提示
def test_add_two_negative(self): res = MathMethod(-1, -2).add() print(
"-1+(-2)的结果是:", res) self.assertEqual(-3, res)
<>编写完测试用例,就到了加载用例,我们来了解一下unittest加载测试用例的方式
<>unittest加载测试用例的方式
测试用例数不多时可采用以下方式加载
1、一个一个添加
suite = unittest.TestSuite() suite.addTest(测试类名('方法名')) # 举例
测试类名:TestMathMethod,方法名:test_add_two_negative #
suite.addTest(TestMathMethod('test_add_two_negative'))
2、通过测试类来加载(loadTestsFromTestCase)
suite = unittest.TestSuite() loader = unittest.TestLoader() #用例加载器 suite.
addTest(loader.loadTestsFromTestCase(测试类名)) # 举例:我们需要引入类名,加载类名下的用例 # from
test_01 import TestMathMethod #具体到类名 #
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))
3、通过模块加载(loadTestsFromModule)
suite = unittest.TestSuite() loader = unittest.TestLoader()#用例加载器 suite.addTest
(loader.loadTestsFromModule(测试模块名)) # 举例:我们需要引入模块名,加载模块下的用例 # from
class_unittest import test_01 #具体到类名 #
suite.addTest(loader.loadTestsFromModule(class01))
测试用例数较多时,采用defaultTestLoader.discover()方式
discover = unittest.defaultTestLoader.discover(start_dir,pattern='test*.py',
top_level_dir=None) #
1、因为unittest中规定,测试用例必须test开头,所以discover中的pattern格式才是test*.py #
2、start_dir是存放测试用例的目录
<>了解unittest.TextTestRunner()
test runner顾名思义就是用来执行测试用例的,并且可以生成相应的测试报告。测试报告有两种展示形式,一种是text文本,一种是html格式。
suite = addTest(test_class)
runner = unittest.TextTestRunner(stream=file, verbosity=2)
runner.run(suite)
file:写入的文件
verbosity:0、1、2,随数字增加,写入的信息更加详细
Python中上下文管理器的理解与使用
上下文管理器就是一个包装任意代码块的对象。
上下文管理器保证进入上下文管理器时,每次代码执行的一致性。
当退出上下文管理器时,相关的资源会被正确的回收。
将测试结果存放至test.txt文件,用上下问管理器,可以节约资源
#执行 上下文管理器---原始的 with open("test.txt", 'w+', encoding='UTF-8') as file: runner
= unittest.TextTestRunner(stream=file, verbosity=2) # 0、1、2 verbosity=2最详细的
runner.run(suite) #print(file.closed) #file.closed判断是否关闭文件 True 关闭
<>进阶——用HTMLTestRunner输出漂亮的HTML报告
我们能够输出txt格式的文本执行报告了,但是文本报告太过简陋,是不是想要更加高大上的HTML报告?但unittest自己可没有带HTML报告,我们只能求助于外部的库了。
HTMLTestRunner是一个第三方的unittest
HTML报告库,首先我们下载HTMLTestRunner.py,并放到当前目录下,或者你的’C:\Python27\Lib’下,就可以导入运行了。
from tools.HTMLTestRunnerCN import HTMLTestReportCN # 导入 # 上下文管理器,,为了节省资源 with
open('test_report.html', 'wb') as file_path: runner = HTMLTestReportCN(stream=
file_path, title="小糊糊—API自动化测试报告", description='小糊糊—API模块用例', tester='小糊糊',
verbosity=2) runner.run(suite)
创建class02.py文件来执行用例
#从模块里面去找 from class_unittest import class01 #具体到模块 #会把所有以test开头得所有测试用例加到容器里
loader= unittest.TestLoader() # 创建一个加载器 suite.addTest(loader.loadTestsFromModule
(class01)) #执行 with open('test_report.html', 'wb') as file_path: runner =
HTMLTestReportCN(stream=file_path, title="小糊糊—API自动化测试报告", description=
'小糊糊—API模块用例', tester='小糊糊', verbosity=2) runner.run(suite)
执行结果,输出测试报告