Python-UnitTest框架

目标:

1.掌握UnitTest框架的基本使用方法

2.掌握断言的使用方法

3.掌握如何实现参数化

4.掌握测试报告的生成


文章目录


(一)UnitTest框架

一、概念:

UnitTest 是 Python 自带的一个单元测试框架,用它来做单元测试。

自带的框架:只要安装了Python,就可以使用。

第三方框架:需要先安装后使用(pytest)

单元测试框架:主要用来做单元测试,一般单元测试是开发做的。

对于测试来说,unittest 框架的作用是自动化脚本(用例代码)执行框架

(使用unittest框架来管理运行多个测试用例)

二、为什么要使用 UnitTest 框架?

① 能够组织多个用例去执行

② 提供丰富的断言方法

③ 能够生成测试报告

三、UnitTest 核心要素(unittest的组成)

  1. TestCase(最核心的模块)

TestCase(测试用例)

主要作用:每个TestCase都是一个代码文件,在这个代码文件中,来书写真正的用例代码

  1. TestSuite

TestSuite(测试套件)

管理组装(打包)多个 TestCase(测试用例)

  1. TestRunner

TestRunner(测试执行,测试运行)

执行TestSuite

  1. TestdLoader

TestLoader(测试加载)

功能是对TestSuite功能的补充,管理组装(打包)多个TestCase

  1. Fixture

Fixture(测试夹具)

书写在TestCase代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容


(二)TestCase测试用例的书写

步骤

1.导入包(unittest)

2.自定义测试类

3.在测试类中书写测试方法

4.执行用例

python 复制代码
# 1.导入包
import unittest

# 2.自定义测试类,需要继承unittest模块中的TestCase类即可
class TestDemo(unittest.TestCase):
	# 3.书写测试方法,即用例代码,目前没有真正的用例代码,使用print代替
	# 书写要求:测试方法必须以test_开头(本质是以test开头)
	def test_method1(self):
		print('测试方法1')

	def test_method2(self):
		print('测试方法2')

# 4.执行用例(方法)
# 4.1 将光标放在类名的后边运行,会执行类中所有的测试方法
# 4.2 将光标放在方法名的后边运行,只执行当前的方法

4.1的运行结果:

4.2的运行结果:


(三)TestSuite 和 TestRunner 的书写

步骤:

1.导入包(unittest)

2.实例化(创建对象)套件对象

3.使用套件对象添加用例方法

4.实例化运行对象

5.使用运行对象去执行套件对象

用例文件:

再新建一个stu02_suite_runner.py文件:

python 复制代码
# 1.导入包
import unittest
from stu02_testcase1 import TestDemo1
from stu02_testcase2 import TestDemo2
from stu02_testcase3 import TestDemo3

# 2.实例化(创建对象)套件对象
suite = unittest.TestSuite()

# 3.使用套件对象添加用例方法
# 套件对象.addTest(测试类名('方法名'))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
suite.addTest(TestDemo3('test_method1'))
suite.addTest(TestDemo3('test_method2'))

# 4.实例化运行对象
runner = unittest.TextTestRunner()

# 5.使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)

▲ 运行结果:

点:用例通过

F:用例不通过

E:error,用例代码有问题


(四)TestLoader 和 Fixture 的使用

一、TestLoader 和 Fixture

1. TestLoader(测试加载)

作用和 TestSuite 的作用是一样的,对 TestSuite 功能的补充,

用来组装测试用例。

使用步骤:

1.导入包

2.实例化测试加载对象并添加用例 ------>得到的是 suite 对象

3.实例化 运行对象

4.运行对象执行套件对象

python 复制代码
# 1.导入包
import unittest

# 2.实例化加载对象并添加用例
# unnittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符
suite = unittest.TestLoader().discover('./case','stu01_*.py')

# 3.实例化运行对象
runner = unittest.TextTestRunner()

# 4.执行
runner.run(suite)

可以将3,4步变为一步

python 复制代码
# 1.导入包
import unittest

# 2.实例化加载对象并添加用例
# unnittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用 *(任意多个任意字符) 通配符
suite = unittest.TestLoader().discover('./case','stu01_*.py')

# 3.实例化运行对象
inittest.TextTestRunner().run(suite)

2. Fixture(测试夹具)

Fixture(测试夹具)是一种代码结构。

在某些特定的情况下,会自动执行。

方法级别

在每个测试方法(用例代码)执行前后都会自动调用的结构。

python 复制代码
# 方法执行之前
def setup(self):
	每个测试方法执行之前都会执行
	pass

# 方法执行之后
def teardown(self):
	每个测试方法执行之后都会执行
	pass
类级别

在每个测试类中所有方法执行前后,都会自动调用的结构(在整个类中,执行之前、执行之后各一次)

python 复制代码
# 类级别的Fixture方法,是一个 类方法
# 类中所有方法之前
@classmethod
def setupClass(cls):
	pass

# 类中所有方法之后
@classmethod
def teardownClass(cls):
	pass
模块级别

模块:代码文件

在每个代码文件执行前后执行的代码结构

python 复制代码
# 模块级别的需要写在类的外边直接定义函数即可
# 代码文件之前
def setupModule():
	pass

# 代码文件之后
def teardownModule():
	pass

方法级别和类级别的 前后的方法,不需要同时出现,根据用例代码的需要自行选择使用。


二、断言

断言:让程序代替人工判断测试程序执行结果是否符合预期结果的过程。

常用的 UnitTest 断言方法:

序号 断言方法 断言描述
1 assertTrue(expr,msg=None) 验证expr是true,如果为false,则fail
2 assertFalse(expr,msg=None) 验证expr是false,如果为true,则fail
3 assertEqual(expected,actual,msg=None) 验证expected==actual,不等则fail
4 assertNotEqual(first,second,msg=None) 验证first!=second,相等则fail
5 assertIsNone(obj,msg=None) 验证obj是None,不是则fail
6 assertIsNotNone(obj,msg=None) 验证obj不是None,是则fail
7 assertIn(member,container,msg=None) 验证是否member in container
8 assertNotIn(member,container,msg=None) 验证是否member not in container

Eg:

python 复制代码
import unittest

class TestAssert(unittest.TestCase):
    def test_equal(self):
        self.assertEqual(1 + 2, 3)  # 相等,断言通过

    def test_in(self):
        self.assertIn("a", ["a", "b", "c"])  # "a"在列表中,通过

    def test_raise(self):
        # 断言除以0会抛出 ZeroDivisionError
        with self.assertRaises(ZeroDivisionError):
            1 / 0

三、参数化

在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量。

1.测试数据一般放在json文件中

2.使用代码读取json文件,提取我们想要的数据------>[(),(0][[],[]]

安装插件:pip install parameterized

代码:

1.导入包 unittest/ pa

2.定义测试类

3.书写测试方法(用到的测试数据使用变量代替)

4.组织测试数据并传参

四、测试报告

pip install html-testRunner

python 复制代码
    runner = HtmlTestRunner.HTMLTestRunner(
        output='reports',  # 报告输出目录
        report_title='测试报告',  # 报告标题
        descriptions='XX测试结果'  # 报告描述
    )
相关推荐
zhongvv11 小时前
应广单片机烧录跳线J7专用PCB使用说明
应广单片机·1024程序员节·电路设计·j7跳线·应广单片机烧录
wkj00111 小时前
uv run python main.py和python main.py的区别?
1024程序员节
LoneEon11 小时前
Ubuntu 系统使用 Docker 部署 Jenkins 详细教程
1024程序员节
长欢喜一场11 小时前
高精度算法全解析:从原理到实现
c++·1024程序员节
m0_7482336411 小时前
单调栈详解【C/C++】
c语言·c++·算法·1024程序员节
励志成为糕手11 小时前
Hive数据仓库:架构原理与实践指南
大数据·数据仓库·hive·1024程序员节·hql
Gee Explorer11 小时前
第一篇使用HTML写一个随机点名网页
css·html5·1024程序员节
奶酪博士11 小时前
【html】每日打卡页面
html·1024程序员节
Monly2111 小时前
HTML:Video视频切换时不重新加载
1024程序员节