1.能够组织多个用例去执行大 2.提供丰富的断言方法(让程序代码代替人工自动的判断预期结果和实际结 果是否相符) 3.能够生成测试报告
1.是一个代码文件,在代码文件中来书写真正的用例代码 2.代码文件的名字必须按照标识符的规则来书写(可以将代码的作用在文件的开头使用注释说明)
print('测试方法1-1')
def test_method2(self): print('测试方法1-2')
import unittest class TestDemo2(unittest.TestCase): def test_method1(self): print('测试方法2-1') def test_method2(self): print('测试方法2-2')
TestSuite(测试套件):管理打包组装TestCase(测试用例) 文件的 TestRunner(测试执行):执行TestSuite(套件)
from test1 import TestDemo1 from test2 import TestDemo2 suite = unittest.TestSuite()
方法一:使用套件对象添加用例方法 suite.addTest(TestDemo1('test_method1')) suite.addTest(TestDemo1('test_method2')) suite.addTest(TestDemo2('test_method1')) suite.addTest(TestDemo2('test_method2'))
方法二:使用套件对象添加用例方法 suite=unittest.TestSuite() suite.addTest(unittest.makeSuite(TestDemo1)) suite.addTest(unittest.makeSuite(TestDemo2))
runner=unittest.TextTestRunner() runner.run(suite)
TestLoader (测试加载),作用和TestSuite 的作用是一样的,对TestSuite 功能的补充,用来组装测试用例的 比如:如果TestCase 的代码文件有很多,(10 20,30 ) -使用步骤 1.导包 2.实例化测试加载对象并添加用例 ---> 得到的是suite对象 3.实例化运行对象 4.运行对象执行套件对象
import unittest
suite=unittest.TestLoader().discover('./case','case') runner=unittest.TextTestRunner().run(suite)
Fixture(测试夹具)是一种代码结构,在某些特定的情况下会自动执行
#方法执行之后 def teardown(self): 每个测试方法执行之后都会执行 pass
#类中所有方法之后 @classmethod def teardownClass(cls): pass
断言的结果有两种:
True,用例通过 False, 代码抛出异常,用例不通过 在unittest 中使用断言,都需要通过self.断言方法来试验 assertEqual self.assertEqual(预期结果,实际结果) # 判断预期结果和实际结果是否相等 1.如果相等。用例通过 2.如果不相导,用例不通过,抛出异常 assertIn self.assertIn(预期结果,实际结果)
#判断预期结果是否包含在实际结果中 1.包含,用例通过 2.不包含,用例不通过,抛出异常
import unittest from test1 import login class LoginTest(unittest.TestCase): def test_username_password_right(self): self.assertEqual('登录成功',login('admin','123456')) def test_username_password_error(self): self.assertin('失败', login('root', '123'))
参数化在测试方法中,使用变量来代替具体的测试数据,然后使用传参的方法将测试数据传递给方法的变量 好处:相似的代码不需要多次书写. 工作中场景: 1.测试数据一般放在json文件中 2.使用代码读取json文件,提取我们想要的数据--> [(), ()] or [[], []]
安装插件 unittest框架本身是不支持参数化,想要使用参数化,需要安装插件来完成 。联网安装(在cmd窗口安装或者) pip install parameterized pip是Python 中包(插件)的管理工具,使用这个工具下载安装插件 验证 pip list #查看到 parameterized 新建一个python 代码文件,导包验证 from pa... import pa... 或者 from parameterized import parameterized
参数化代码 1.导包unittest/ pa 2.定义测试类 3.书写测试方法(用到的测试数据使用变量代替) 4.组织测试数据并传参(@装饰器) 例子: import unittest from parameterized import parameterized
from test1 import login
数据方法一: data=[ ('admin','123456','登录成功'), ('root', '123456','登录失败') ] 数据方法二: import json def build_data(): with open('logindata.json',encoding='utf-8') as f: result=json.load(f) data = [] for i in result: data.append((i.get('username'),i.get('password'),i.get('expect'))) return data
class TestLogin(unittest.TestCase): @parameterized.expand(data) def testlogin(self,username,password,expect): self.assertEqual(expect,login(username,password))
logindata: [ {"desc": "正确用户名和密码", "username": "admin", "password": "123456", "expect": "登录成功"},
{"desc": "错误用户名和正确密码", "username": "root", "password": "123456", "expect": "登录失败"},
{"desc": "正确用户名和错误密码", "username": "admin", "password": "123", "expect": "登录失败"},
{"desc": "错误用户名和错误密码", "username": "root", "password": "123", "expect": "登录失败"}
对于一些未完成的或者不满足测试条件的测试函数和测试类,不想执行,可以使用跳过 使用方法,装饰器完成 代码书写在TestCase 文件
#直接将测试函数标记成跳过 @unittest. skip( '跳过额原因' )
#根据条件判断测试函数是否跳过,判断条件成立,跳过 @unittest. skipIf(判断条件,' 跳过原因')
]