Unittest框架使用

本文介绍了Python的unittest模块,包括测试用例.TestCase的编写,测试套件.TestSuite的组合,测试执行.TestRunner的运行,测试加载.TestLoader的功能,以及测试夹具.Fixture的使用。此外,详细讲解了断言方法如assertTrue和assertFalse,参数化的实现,跳过测试的标记,以及如何生成测试报告。unittest是Python中用于自动化测试的重要工具。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

作用

①能够值多个用例去执行
②提供丰富的断言方法
③能够生成测试报告

核心要素(组成)

  • ①TestCase 测试用例 :是unittest 的组成部分

作用是 用来书写真正的用例代码(脚本)

  • ②TestSuite 测试套件:是用来组装(打包)测试用例的

即 可以将多个用例脚本文件 组装到一起

  • ③TestRunner 测试执行(测试运行):是用例执行 TestSuite(测试套件)
  • ④TestLoader 测试加载:对TestSuite(测试套件)功能的补充

用来组装(打包)TestCase(测试用例)的

  • ⑤Fixture 测试夹具:是一种代码结构,书写 前置方法(执行用例之前的方法)代码 和 后置方法(执行用例之后的方法)的代码

用例 执行顺序为:前置 》 用例 》 后置

TestCase 测试用例

书写真正的用例代码(脚本)

格式:
①导包 import unittest
②定义测试类
③书写测试方法
④执行

书写测试方法时方法名必须以 test 开头

执行一:在类名或者方法名后边右键运行

①在类名后边执行,执行类中的所有的测试方法
②在方法名后边执行,只执行当前的测试方法

执行二:在主程序使用 unittest.main() 来执行

if  _ _name_ _   =  '_ _main_ _ ':
   unittest.main()

注意事项:
①代码文件名字 要满足标识符的规则
②代码文件名字 不要使用中文

TestSuite 测试套件

将多条用例脚本集合在一起就是套件,即用来组装用例的

格式
①导包 import unittest
②实例化套件对象: unittest.TestSuite()
③添加用例方法:
方法一:添加单个测试类
套件对象.addTest (测试类名('测试方法名'))
方法二:添加整个测试类
套件对象.addTest(unittest.makeSuite (测试类名))

TestRunner 测试执行(测试运行)

用来执行套件对象

格式
①导包: import unittest
②实例化执行对象: unittest.TextTestRunner()
③执行对象去执行套件对象:执行对象.run(套件对象)

TestSuite与TestRunner一起用的格式
①导包: import unittest
②实例化套件对象: unittest.TestSuite()
③添加用例方法
④实例化 执行对象: unittest.TextTestRunner()
⑤执行对象去执行 套件对象:执行对象.run(套件对象)

查看执行结果

执行界面的显示信息
① …:表示用例通过
②F :表示用例不通过
③E :表示用例代码错误

TestLoader 测试加载

作用 和 TestSuite 一样,组装用例代码,同样也需要使用 TestRunner()去执行

执行10个用例脚本时 ,使用 makeSuite()

格式
①导包: import unittest
②实例化加载对象并加载用例 ——得到的是套件对象
③实例化执行对象并执行

Fixture 测试夹具

代码结构,在用例执行前后会自动执行的代码结构

方法级别

在每个用例执行前后都会自动调用,方法名固定

格式

def setUp(self):  #前置
   #每个用例执行前后都会自动调用
   pass
def tearDown(self):   #后置
   #每个用例执行前后都会自动调用
   pass

即
方法前置   用例  方法后置

类级别

在类中所有的测试方法执行前后,会自动执行的代码,只执行一次

格式

#类级别的 Fixture 需写作类方法

@classmethod
def setUpClass(self): #类前置
   #每个用例执行前后都会自动调用
   pass
@classmethod
def tearDownClass(self):  #类后置
   #每个用例执行前后都会自动调用
   pass

即
类前置   方法前置  用例   方法后置   方法前置  用例  方法后置  类后置

断言

使用代码自动的判断预期结果和实际结果是否相符

为什么要断言

①提高测试效率
②实现自动化测试(让脚本在无人值守状态下运行)

常用的unittest 断言方法

  • assertTrue(expr,msg = None)
    验证expr是true,如果为false,则fail
  • assertFalse(expr,msg = None)
    验证expr是false,如果为true,则fail
  • assertEqual(expected(即预期结果),actual(即实际结果),msg = None)
    验证expected = = actual,不等则fail

判断 预期结果 和 实际结果 是否相等,如果相等,用例通过,如果不相等,抛出异常,用例不通过

  • assertEqual(first,second,msg = None)
    验证first != second,相等则fail

  • assertNone(obj,msg = None)
    验证码obj是None,不是则fail

  • assertNotNone(obj,msg = None)
    验证码obj不是None,是则fail

  • assertIn(member(预期结果),container(实际结果),msg = None)
    验证是否member in container

判断 预期结果 是否包含在 实际结果 中,如果存在,用例通过,如果不存在,抛出异常,用例不通过

  • assertNotIn(member,container,msg = None)
    验证是否member not in container

参数化

将测试数据定义到 json 文件

通过参数的方式来传递数据,从而实现数据和脚本分离。并且可以实现用例的重复执行

在书写用例方法的时候,测试数据使用变量代替,在执行的时候进行数据传递

unittest 测试框架,本身不支持参数化,但是可以通过安装unittest扩展 插件 parameterized 来实现

安装 parameterized

①在终端输入 pip install parameterized
②设置里面的“project:——>python Interpreter

查看安装的所有插件

pip list
pip show 包名

卸载安装的插件

pip   uninstall   包名

导包

from  parameterized  import   parame

使用参数化格式

①组织测试数据,格式[(),(),()],一个元组就是一组测试数据
②在测试方法上方使用 装饰器 @parameterized . expand(测试数据)
③运行(直接 TestCase 或者使用 suite 运行)

跳过

某些用例由于某种原因不满足测试条件的测试函数和测试类,设置为跳过

使用方式

①直接将测试函数标记成跳过

@unittest.skip(‘跳过原因’)

②根据条件判断测试函数是否跳过

@unittest.skipIf(判断条件,reason = ‘原因’)  #判断条件为true,执行跳过

生成测试报告

(使用 suite 和 runner(第三方))

安装 parameterized

①在终端输入 pip install HTMLTestReport
②设置里面的“project:——>python Interpreter

使用

①unittest、HTMLTestReport
②组装用例(套件,loader)
③使用 HTMLTestReport 中的 runner 执行套件
④查看报告

使用绝对路径

项目是分目录书写的,使用 相对路径 可能会出现找不到文件的情况,此时需要使用 绝对路径

方法
①在项目的根目录,创建一个 python 文件(app . py 或者 config . py)
②在这个文件中,获取 项目的目录,在其他代码中使用 路径进行拼接完成 绝对路径 的书写

获取当前文件的绝对路径

filepath = os . path.absoath(_ _file_ _)

获取文件路径的目录名称

方法一:

dirname = os.path.dirname(_ _file_ _)

方法二:

dirname = os.path.dirname(os.path.abspath(_ _file_ _))
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值