基础语法
表达用例-----收集用例-----执行用例-----生成报告 定义测试类,继承 unittest.TestCase
在测试类当中,以test_开头,定义测试函数。
每一个test_开头的函数,就是一个测试用例
编写用例:
- 测试数据
- 测试步骤
- 断言:预期结果与实际结果的比对
AssertionError:断言失败 assert 表达式 True表示通过,False表示不通过
常用方法
实例: login.py
def login_check(username=None,password=None):
if username!=None and password !=None:
if username == 'admin' and password == '123456':
return {"code":0,"msg":"登录成功"}
else:
return {"code":1,"msg":"用户名或密码错误"}
else:
return {"code":1,"msg":"所有参数不能为空"}
测试用例类
import unittest
from Denmo2.login import login_check
class TestLogin(unittest.TestCase):
def test_login_ok(self):
res = login_check('admin','123456')
self.assertEqual(res,{"code":0,"msg":"登录成功"})
def test_login_wrong_password(self):
res = login_check('admin', '1234567')
self.assertEqual(res, {"code":1,"msg":"用户名或密码错误"})
def test_login_wrong_user(self):
res = login_check('admin1', '123456')
self.assertEqual(res, {"code": 1, "msg": "用户名或密码错误"})
def test_login_no_password(self):
res = login_check('admin')
self.assertEqual(res, {"code":1,"msg":"所有参数不能为空"})
def test_login_no_user(self):
res = login_check('123456')
self.assertEqual(res, {"code":1,"msg":"所有参数不能为空"})
前置后置
概念; setUp—在类下面的每一个用例执行之前,会执行setUp tearDown—在类下面每一个用例执行之后,会执行tearDown setUpClass—在类第一个用例执行之前,会执行setUpClass tearDownClass—在类最后一个用例执行之后,会执行tearDownClass
语法: setUp------测试用例------tearDown setUpClass------测试类的所有用例------tearDownClass
实例:
def setUp(self) -> None:
print('这是前置')
def tearDown(self) -> None:
print('这是后置')
@classmethod
def setUpClass(cls) -> None:
print('类前置,用例开始执行')
@classmethod
def tearDownClass(cls) -> None:
print('类后置,用例执行完毕')
执行用例
TestSuite()
方法一:add(类名(‘用例名’))添加一个测试用例 方法二:addTests([])添加一个测试用例的列表
import unittest
from Denmo2.test_login import TestLogin
from Denmo2.test_register import TestDemo
#1.实例化测试套件TestSuite
s = unittest.TestSuite()
#添加一个用例
s.addTest(TestLogin('test_login_ok'))
TestLoader 可通过类名,模块名,目录三种方式去收集用例。 方法一:目录(常用) unittest.TestLoader().discover(搜索目录) 默认在test*.py中搜索用例
unittest.TestLoader().discover(r"D:\python\py\Denmo2")
运行
# 从start_directory这个目录下开始,搜索所有的测试用例,并加载到测试套件当中
# 1.指定搜索目录
# 2.文件过滤规则:以文件名匹配。test*.py
# 3.在文件当中过滤用例:继承了unittest.TestCase类的测试类,类当中以test_开头的测试函数
s = unittest.TestLoader().discover(r"D:\python\py")
runner = unittest.TextTestRunner()
runner.run(s)
测试报告 HTMLTestRunner
from HTMLTestRunnerNew import HTMLTestRunner
with open('report.html','wb') as fs:
runner = HTMLTestRunner(fs,title='测试报告1123',tester='wyf')
runner.run(s)
BeautifulReport
from BeautifulReport import BeautifulReport
br = BeautifulReport(s)
br.report('python单元测试报告','br_report.html')
用例执行顺序 ASCII码的大小规则 0 ~ 9<A~Z<a ~z 如果你想自己指定执行顺序,在文件名或者用例名上做文章
设计思维
数据驱动思想 ddt:data driven test 一个测试流程,N组测试用例 流程不变,只是测试数据和断言的数据不一样。 模块名:ddt /pip install ddt 将多组测试数据,依次传递给一个测试流程 0.import ddt 1.在测试类名的上面,用@ddt.ddt 2.在测试函数上面,用ddt.data(*列表) 3.在测试函数的参数当中,定义一个参数,用来接受每一组数据 实例:
import ddt
import unittest
from Denmo2.login import login_check
datas = [
{'user':'admin','password':'123456','check':{"code":0,"msg":"登录成功"}},
{'user':'admin','password':'1234561','check':{"code":1,"msg":"用户名或密码错误"}},
{'user':'admin1','password':'123456','check':{"code":1,"msg":"用户名或密码错误"}}
]
@ddt.ddt
class TestLogin(unittest.TestCase):
@ddt.data(*datas)
def test_login(self,case):
res = login_check(case['user'],case['password'])
self.assertEqual(res,case['check'])
总结
ubittest框架4个核心概念:
- 用例编写TestCase
断言:self,assertXXXXX fixture前置后置:setUp / tearDown / setUpClass / tearDownClass - 用例套件TestSuite
容器,放用例,addTest,addTests - 用例收集TestLoader
discover搜索目录,返回TestSuite对象 - 生成报告TextTestRunner
HTMLTestRunner Beautifu
表达用例: setUp tearDown setUpClass tearDownClass 收集用例: TestSuite() TestLoader().discover(搜索目录) 用例搜索原则-目录-文件(test*.py)-测试用例 执行用例和生成报告 HTMLTestRunner–实例化后调用run方法,html报告 BeautifulReport–实例化对象后,report方法 执行顺序 ASCII码 数据驱动 ddt
|