作用
①能够值多个用例去执行
②提供丰富的断言方法
③能够生成测试报告
核心要素(组成)
- ①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_ _))