一、unittest框架最核心的四个概念
TestCase:一个TestCase中的用例就是一个测试用例
TestSuite:多个测试用例集合在一起;TestLoader:用来加载测试用例到测试套件中
TextTestRunner:用来执行测试用例
fixture:测试环境的搭建和销毁
二、测试用例类的创建
1、定义的测试用例类必须继承unittest.TestCase类
2、定义的测试用例类下定义的测试用例方法,其方法名必须以test开头
3、每条测试用例方法的逻辑代码按①准备用例数据;②获取实际结果;③断言的步骤编写
4、unittest中测试用例的执行顺序根据方法名按ASCII码进行排序
5、unittest是根据用例方法执行时,是否出现断言异常来判断用例是否通过
假设有一个名为login_check的登录功能函数需要测试,如下:
def login_check(username=None, password=None): if username != None and password != None: if username == 'python' and password == '123456': return {"code": 0, "msg": "登陆成功"} else: return {"code": 1, "msg": "账号或密码不正确"} else: return {"code": 1, "msg": "所有参数不能为空"}
为之编写了若干条测试用例:
""" 准备的部分测试用例: 1、账号密码正确 入参:账号python 密码123456 预期结果:{"code": 0, "msg": "登陆成功"} 2、账号正确,密码错误 入参:账号python 密码12345 预期结果:{"code": 1, "msg": "账号或密码不正确"} 3、账号错误,密码正确 入参:账号pyth 密码123456 预期结果:{"code": 1, "msg": "账号或密码不正确"} 4、账号为空 入参:账号为空 密码123456 预期结果:{"code": 1, "msg": "所有参数不能为空"} 5、密码为空 入参:账号python 密码为空 预期结果:{"code": 1, "msg": "所有参数不能为空"} """
创建测试用例类:
import unittest from exercise02.funcdemo_unittest import login_check class LoginTestCase(unittest.TestCase): def test_login_pass(self): expected = {"code": 0, "msg": "登陆成功"} data = {"username": "python", "password": "123456"} res = login_check(**data) self.assertEqual(expected, res) def test_pwd_error(self): expected = {"code": 1, "msg": "账号或密码不正确"} data = {"username": "python", "password": "12345"} res = login_check(**data) self.assertEqual(expected, res) def test_acc_error(self): expected = {"code": 1, "msg": "账号或密码不正确"} data = {"username": "pyth", "password": "123456"} res = login_check(**data) self.assertEqual(expected, res) def test_acc_none(self): expected = {"code": 1, "msg": "所有参数不能为空"} data = {"username": None, "password": "123456"} res = login_check(**data) self.assertEqual(expected, res) def test_pwd_none(self): expected = {"code": 1, "msg": "所有参数不能为空"} data = {"username": "python", "password": None} res = login_check(**data) self.assertEqual(expected, res)
三、创建测试套件及加载测试用例
1、创建测试套件:suite=unittest.TestSuite()
2、加载测试用例(五种方式)
方式一:通过测试用例类加载
import unittest from exercise02.testcases_unittest import LoginTestCase suite = unittest.TestSuite() loader = unittest.TestLoader() suite.addTest(loader.loadTestsFromTestCase(LoginTestCase))
方式二:通过测试用例模块加载
import unittest from exercise02 import testcases_unittest suite = unittest.TestSuite() loader = unittest.TestLoader() suite.addTest(loader.loadTestsFromModule(testcases_unittest))
方式三:通过路径加载(注:路径中测试用例所在模块的模块名也需要以test开头)
import unittest suite = unittest.TestSuite() loader = unittest.TestLoader() suite.addTest(loader.discover(r"F:\road_of_python\exercise02"))
方式四:一条一条用例加载
import unittest from exercise02.testcases_unittest import LoginTestCase suite = unittest.TestSuite() case1 = LoginTestCase("test_login_pass") suite.addTest(case1)
方式五:创建测试套件与加载测试用例合二为一
import unittest suite = unittest.defaultTestLoader.discover(r"F:\road_of_python\exercise02")
四、执行测试用例
runnner=unittest.TextTestRunner()
runner.run(suite)
如:
# 通过测试用例类加载并执行 import unittest from exercise02.testcases_unittest import LoginTestCase suite = unittest.TestSuite() loader = unittest.TestLoader() suite.addTest(loader.loadTestsFromTestCase(LoginTestCase)) runner = unittest.TextTestRunner() runner.run(suite)
五、生成测试报告
首先可以pip安装BeautifulReport这个库
然后将上述“执行测试用例”中两行代码替换:
import unittest from exercise02.testcases_unittest import LoginTestCase from BeautifulReport import BeautifulReport suite = unittest.TestSuite() loader = unittest.TestLoader() suite.addTest(loader.loadTestsFromTestCase(LoginTestCase)) br = BeautifulReport(suite) br.report("这是一份测试报告", "brreport.html")