unittest框架基础
一、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")