unittest测试框架的使用流程

家电修理 2023-07-16 19:16www.caominkang.com电器维修

最近为了分享自动化框架,帮助功能测试理解,整理了一下 unittest 单元测试框架

Unittest单元测试框架的构成

TestCase 编写用例
TestSuit 组织用例
TestRunner 执行用例
TestFixture 处理用例,SetUp -预处理,用例开始,TearTon清理数据,用例结尾

这是我们封装的计算函数 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_to_positive(self):
  res = MathMethod(1, 1).add()
  print("1+1的结果是", res)
  self.assertEqual(2, res)
  
 def test_add_to_zero(self):
  res = MathMethod(0, 0).add()
  print("0+0的结果是", res)
  self.assertEqual(0, res) 

 def test_add_to_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(),teardon(),这种在执行时,会每执行类中的一个测试方法,分别在执行前setup(),执行后teardon()。
  另一种时书写成类的方法,使用@classmethod,setUpClass()和tearDonClass(),这这种在执行时,会先执行setupClass(),执行完类中所有的测试用例后,执行tearDonClass()中的方法。

class TestMathMethod(unittest.TestCase):  #继承了unittest里面的
 def setUp(self): # step 执行每一条测试用例之前会执行setUp里面
  print("我要开始执行用例了")
  
 def tearDon(self):  #重写   #tearDon每一条用例执行完毕后执行
  print("我已执行完毕用例了")

 #如果说  你有操作必须在执行用例之前  准备好  那就放到setUp
 #如果说你有操作必须在执行用例之后要清除那就放到tearDon

 def test_add_to_positive(self):
  res = MathMethod(1, 1).add()
  print("1+1的结果是", res)
  # 加一个断言判断期望值与实际值的比对结构  一致就算通过 不一致就算失败
  self.assertEqual(2, res)

 def test_add_to_zero(self):
  res = MathMethod(0, 0).add()
  print("0+0的结果是", res)
  self.assertEqual(1, res, "出错了")  #用例执行失败了才会提示

 def test_add_to_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_to_negative
# suite.addTest(TestMathMethod('test_add_to_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', _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写入的文件
verbosity0、1、2,随数字增加,写入的信息更加详细

Python中上下文管理器的理解与使用
上下文管理器就是一个包装任意代码块的对象。
上下文管理器保证进入上下文管理器时,每次代码执行的一致性。
当退出上下文管理器时,相关的资源会被正确的回收。

将测试结果存放至test.txt文件,用上下问管理器,可以节约资源

#执行   上下文管理器---原始的
ith open("test.txt", '+', 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:Python27Lib’下,就可以导入运行了。

from tools.HTMLTestRunnerCN import HTMLTestReportCN  # 导入
#  上下文管理器,,为了节省资源
ith open('test_report.html', 'b') 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))

#执行
ith open('test_report.html', 'b') as file_path:
 runner = HTMLTestReportCN(stream=file_path,
         title="小糊糊—API自动化测试报告",
         description='小糊糊—API模块用例',
         tester='小糊糊',
         verbosity=2)
 runner.run(suite)

执行结果,输出测试报告

Copyright © 2016-2025 www.caominkang.com 曹敏电脑维修网 版权所有 Power by