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测试结果'  # 报告描述
    )
相关推荐
学传打活1 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng1689 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心11 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552717 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552718 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝19 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552719 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552720 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552722 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552722 天前
Java I/O核心操作实战
人工智能·1024程序员节