unittest_核心概念(进阶)
unittest 核心概念
1、测试脚手架 TestCase提供的一系列的方法,他会在测试前,测试后执行
1.1、setUP在每个单元测试函数开始前执行
1.2、tearDown在每个测试函数结束后执行
1.3、setUPClass 在整个测试用例类执行之前执行 (是类方法,需要装饰器)
1.4、tearDownClass 在整个测试用例类执行完毕前执行 (是类方法,需要装饰器)
2、测试用例 一个独立的测试单元,unittest提供的一个基类,TestCase
3、测试套件 一个测试用例的列表 testsuite,归档需要一起执行的测试
3.1、直接使用unittest.TestSuite实例化,一个一个的添加
添加的时候 测试用例类(测试方法名)
3.2、使用unittest.TestLoader实例化,传入测试用例类名/模块/包,需要导入测试用例类
3.3、使用unittest.TestLoader().discover()方法来收集用例
测试用例模块名要以test开头
4、测试运行器 执行测试用例,并输出结果
4.1、uninttest.TestTestRunner 实例化调用run的方法,传入测试套件
runner(ts)
4.2、HTMLTestRunnerNew
4.3、BeautifulReport
4.4、运行顺序就是收集顺序,收集顺序是按照ascii码(.py/函数/方法)
第一创建login.py
def login_check(username,password):
"""
:param username:账号
:param password:密码
:return:
"""
if 6 <= len(password) <= 18:
if username == 'python34' and password == 'lemonban':
return {"code": 0,"msg":"登陆成功"}
else:
return {"code": 1,"msg":"账号或密码不正确"}
else:
return {"code":1,"msg":"密码长度在6-18位之间"}
# __name__ 是模块的特殊变量
# 当直接之前当前模块的时候__name__='__main__'
# 当被其他模块导入的时候__name__ = 模块名
# pass占位符,什么都不是,表示跳过
if __name__ == '__main__':
pass
第二创建test_case.py (测试用例类1)
# 导入unittese,导入被检测函数或者类
# 一般系统模块放在最上面
# 第三方模块放在系统模块的下面
# 自己写的模块放在最下面
import unittest
from day17.login import login_check
# 创建测试类,继承unittest.TeseCase类,测试用例
class Testlog(unittest.TestCase):
"""
测试登录功能
"""
# 3、如果有初始(前置)条件和结束(后置)条件,重写脚手架(fixture)方法
# 4、定义单元测试函数,函数名要以test开头
def setUp(self) -> None:
"""
测试函数前置
:return:
"""
print('在每个测试函数开始前执行')
def tearDown(self) -> None:
"""
测试函数后置
:return:
"""
print('在每个测试函数结束后执行')
@classmethod
def setUpClass(cls) -> None:
"""
测试类前置
:return:
"""
print('在整个类开始前执行')
@classmethod
def tearDownClass(cls) -> None:
"""
测试类后置
:return:
"""
print('在整个类结束后执行')
def test_log_ok(self):
"""
账号密码正确
:return:
"""
# 1、测试数据
test_data = {"username": "python34", "password": "lemonban"}
# 期望数据
expect_data = {"code": 0, "msg": "登陆成功"}
# 测试步骤
# 执行函数-,**解包,键相同,相当于把test_data中的两个值传给了login_check
res = login_check(**test_data)
# 3、断言(判断)assert
self.assertEqual(expect_data, res)
# 如果不相等会抛出assertError,断言错误
print('第一条用例')
def test_log_password_error(self):
"""
账号正确,密码错误
:return:
"""
# 1、测试数据
test_data = {"username": "python342", "password": "lemonban"}
# 期望结果
expected = {"code": 1, "msg": "账号或密码不正确"}
# 2、测试步骤
res = login_check(**test_data)
# 3、断言
self.assertEqual(expected, res)
print("第二条用例")
def test_password_ok_pass_error(self):
test_date = {"username": "python34", "password": "lemonban1"}
expected = {"code": 1, "msg": "账号或密码不正确"}
res = login_check(**test_date)
self.assertEqual(res,expected)
print('第三条用例')
def test_password_lenth_little(self):
test_data = {"username": "python34", "password": "lem"}
expected = {"code": 1, "msg": "密码长度在6-18位之间"}
res = login_check(**test_data)
self.assertEqual(expected,res)
print('第四条用例')
def test_password_lenth_blg(self):
test_data = {"username": "python34", "password": "lemonbanaaaaaaaaaaaaaaa1"}
expected = {"code":1,"msg":"密码长度在6-18位之间"}
res = login_check(**test_data)
self.assertEqual(expected,res)
print('第五条用例')
# 5、调用unittese.main()来执行测试用例
if __name__ == '__main__':
a = 1
# 会自动收集TestCase类里的单元测试函数
unittest.main()
第三创建test_dome.py (测试用例类2)
import unittest
class TeststrUpper(unittest.TestCase):
def test_str_upper(self):
"""
测试字符串的方法upper
:return:
"""
self.assertEqual('ABC','abc'.upper())
第四创建main.py (收集用例/执行/输出)
import unittest
from day17.test_dome import TeststrUpper
from day17.test_case import Testlog
# #第一种收集用例方法unittest.TestSuite
# # 1、实例化一个测试套件
# ts = unittest.TestSuite()
# # 2、收集测试
# # 一个一个的添加
# # 单元测试的语法:测试用例类名("单元测试方法名")
# ts.addTest(TeststrUpper('test_str_upper'))
# # 一次添加多个
# ts.addTests([Testlog('test_log_ok'), Testlog('test_log_password_error')])
#
# # 第二种收集用例方法unittest.TestLoader
# # TestLoader对象,收集器
# tloader = unittest.TestLoader()
# # 通过测试用例类名,不要加括号,需要导入
# tloader.loadTestsFromTestCase(Testlog)
# # 以上两种方法比较笨拙
# 第三种收集用例的方法,也是常用的方法是
tloader = unittest.TestLoader()
# discover方法接收三个参数
# - start_dir 开始查找的目录 (一般只传开始目录即可),'.' 表示根目录
# - pattern 查找模块名的规则 test*.py 以test开头的模块(py文件),收集里面的测试用例,继承了unittest.TestCase
# - top_level_dir 项目的顶层目录
# 开始查找的目录要有__init__.py文件,才算是一个模块(包)
ts = tloader.discover(r'D:\PYthon\untitled_test\Ningmengban\day17')
# # 执行测试
# # 第一种,文本测试运行器,实例化运行器
# runner = unittest.TextTestRunner()
# # 传入测试套件
# res = runner.run(ts)
# print(res)
#
# # 1、编写测试用例类
# # 2、收集测试用例
# # 3、运行测试,输出结果
# # 第二种,HTML测试运行器,别人的包
# # HTMLTestRunnerNew
# from day17.HTMLTestRunnerNew import HTMLTestRunner
# with open(r'D:\PYthon\untitled_test\Ningmengban\day17\report.html','wb') as f:
# runner = HTMLTestRunner(
# stream=f,description='第一份测试报告',title='测试报告',tester='冯昆垒'
# )
# runner.run(ts)
# # BeautifulReport,可下载
from BeautifulReport import BeautifulReport
br = BeautifulReport(ts)
br.report('测试报告','bReport.html',report_dir=r'D:\PYthon\untitled_test\Ningmengban\day17')
HTMLTestRunnerNew.py
链接:https://pan.baidu.com/s/1Pe7sdMl6dHalPNW8OntD5w
提取码:FKL8
复制这段内容后打开百度网盘手机App,操作更方便哦