UnitTest框架
UnitTest是Python自带的一个单元测试框架,用它来做单元测试,是自带的框架,不需要单外安装,只要安装了python就可以使用。
第三方框架:想要使用 需要先安装后使用(pytest)
单元测试框架:主要用来做单元测试,一般是开发做的。
对于测试来说,unittest 框架的作用是 自动化脚本(用例代码)执行框架(使用unittest框架 来管理 运行 多个测试用例的
UnitTest框架的作用:
- 能够组织多个用例去执行
- 提供丰富的断言方法(让程序代码代替人工自动的判断预期结果和实际结果是否相符)
- 能够生成测试报告
UnitTest的组成:
- TestCase(测试用例),是unittest框架的组成部分不是手工和自动化中所说的(Test Case)。每个TestCase 都是一个代码文件,在这个代码文件中用来书写真正的用例代码。
- TestSuite (测试套件),用来管理 组装(打包)多个 TestCase(测试用例)的
- TestRunner(测试执行,测试运行),用来 执行TestSuite的。
- TestLoader(测试加载),功能是对 TestSuite(测试套件)功能的补充,管理 组装(打包)多个TestCase。
- Fixture(测试夹具),书写在TestCase代码中,是一个代码结构,可以在每个方法执行前后都会执行的内容。
TestCase
代码学习目的:学习 TestCase(测试用例)模块的书写方法
# 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 将光标放在 方法名的后边 运行, 只会执行当前的方法
将光标放在 类名的后边 运行, 会执行类中的所有的测试方法
将光标放在 方法名的后边 运行, 只会执行当前的方法
TestSuite和TestRunner
方法一:套件对象.addTest(测试类名(‘方法名’))
"""
学习 TestSuite 和 TestRunner 的使用
"""
# 1.导包(unittest)
import unittest
# 2.实例化(创建对象)套件对象,
from ceshi.模块unitest import TestDemo
suite = unittest.TestSuite()
# 3.使用套件对象添加用例方法
# 方式一,套件对象.addTest(测试类名('方法名')) #建议测试类名和方法名直接去复制,不要手写
suite.addTest(TestDemo('test_method1'))
suite.addTest(TestDemo('test_method2'))
# 4.实例化运行对象
runner = unittest.TextTestRunner()
# 5.使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)
注意实例化运行对象是TextTestRunner()
运行结果
方法二:套件对象.addTest(unittest.makeSuite(测试类名))
方式二,将已给测试类中的所有方法进行添加
#套件对象.addTest(unittest.makeSuite(测试类名))
#缺点: makeSuite() 不会提示
# 1.导包(unittest)
import unittest
# 2.实例化(创建对象)套件对象,
from ceshi.模块unitest import TestDemo
suite = unittest.TestSuite()
# 3.使用套件对象添加用例方法
# 方式二,将已给测试类中的所有方法进行添加
# 套件对象.addTest(unittest.makeSuite(测试类名))
# 缺点: makeSuite() 不会提示
suite.addTest(unittest.makeSuite(TestDemo))
# 4.实例化运行对象
runner = unittest.TextTestRunner()
# 5.使用运行对象去执行套件对象
# 运行对象.run(套件对象)
runner.run(suite)
运行结果:
运行结果中的 ..
表示 用例通过;F
用例不通过; error
用例代码有问题。
TestLoader(测试加载)
TestLoader(测试加载),作用和 TestSuite 的作用是一样的,对 TestSuite 功能的补充,用来组装测试用例的。
使用步骤:
- 导包
- 实例化测试加载对象并添加用例 ==》得到的是suite对象
- 实例化 运行对象
- 运行对象执行套件对象
在一个项目中 TestCase的代码,一般放在一个单独的目录中。
方法一
# 1.导包
import unittest
# 2.实例化加载对象并添加用例
# unittest.TestLoader().discover('用例所在的路径','用例的代码文件名')
# 用例所在的路径,建议使用相对路径,用例的代码文件名可以使用*(任意多个任意字符)通配符
suite = unittest.TestLoader().discover('../ceshi','unittest*.py')
# # 3.实例化运行对象
# runner = unittest.TextTestRunner()
#
# # 4.执行
# runner.run(suite)
# 可以将 3 4 步 变为一步
unittest.TextTestRunner().run(suite)
ceshi文件夹目录里以unittest开头的有两个:
运行结果都为:
运行TestLoader结果为:
方法二
# 1.导包
import unittest
# 2.使用默认的加载对象并加载用例
suite = unittest.defaultTestLoader.discover('ceshi','unittest*.py')
unittest.TextTestRunner().run(suite)
运行结果:
Fixture
一种代码结构
在某些特定情况下会自动执行
方法级别
在每个测试方法(测试用例)执行前后 都会自动调用的结构
# 方法执行之前
def setUp(self):
每个测试方法之前都会执行
pass
# 方法执行之后
def teardown(self):
每个测试方法执行之后都会执行
pass
类级别
在每个测试类中所有的方法执行前后 都会自动调用的结构(在整个类中 执行之前执行之后各一次)
# 类级别的Fixture方法,是一个类方法
# 类中所有方法之前
@classmethod
def setUpClass(cls):
pass
# 类所有方法之后
@classmethod
def teardownClass(cls):
pass
模块级别
模块:代码文件
在每个代码文件执行前后执行的代码结构
# 模块级别的需要写在类的外边直接定义函数即可
# 代码文件之前
def setUpModule():
pass
# 代码文件之后
def tearDownModule():
pass
方法级别和类级别的 前后方法不需要同时出现,根据用例代码的需要自行的选择使用。
代码举例:
import unittest
class TestLogin(unittest.TestCase):
def setUp(self):
"""每个测试方法执行之前都会先调用的方法"""
print('输入网址......')
def tearDown(self) -> None:
"""每个测试方法执行之后都会调用的方法"""
print('关闭当前页面......')
@classmethod
def setUpClass(cls) -> None:
print('1.打开浏览器')
@classmethod
def tearDownClass(cls) -> None:
print('5.关闭浏览器')
def test_1(self):
print('输入正确用户名密码验证码,点击登录1')
def test_2(self):
print('输入正确用户名密码验证码,点击登录2')
运行结果: