UnitTest框架:管理多个用例
断言:进行判断
参数:传参
测试报告生成
UnitTest框架定义
UnitTest框架的作用:管理和运行多个用例
UnitTest的核心要素
相同的代码写在Fixture里面
![](https://img-blog.csdnimg.cn/direct/992e46d635ab48819f67faef92020c4a.png)
TestCase(测试用例)
import unittest
class TestDemo(unittest.TestCase):
def test_method1(self): #以test开头!!!
print('测试方法1')
def test_method2(self):
print('测试方法2')
一些问题总结
如果文件名字有中文 或者不规范 一般会有这个页面提示
删除已有的运行方式:
![](https://img-blog.csdnimg.cn/direct/2157a5a9b08547dbaea64bc2b002a86f.png)
TestSuite & TestRunner
import unittest
from d94 import TestDemo
from d95 import TestDemo1
from d96 import TestDemo2
# 实例化对象
suite = unittest.TestSuite()
# method 1
# 添加用例方法
suite.addTest(TestDemo('test_method1'))
suite.addTest(TestDemo('test_method2'))
suite.addTest(TestDemo1('test_method1'))
suite.addTest(TestDemo1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
# 实例化运行对象
runner = unittest.TextTestRunner()
#运行
runner.run(suite)
makeSuite
import unittest
from d94 import TestDemo
from d95 import TestDemo1
from d96 import TestDemo2
suite = unittest.TestSuite()
# 可以导入类中的所有方法
suite.addTest(unittest.makeSuite(TestDemo))
suite.addTest(unittest.makeSuite(TestDemo1))
suite.addTest(unittest.makeSuite(TestDemo2))
runner = unittest.TextTestRunner()
runner.run(suite)
import unittest
from d99 import add
class TestAdd(unittest.TestCase):
def test_method(self):
# 1 2 3
if add(1,2) == 3:
print('测试通过')
else:
print('测试不通过')
def test_method2(self):
# 10 20 30
if add(10,20) == 20:
print('测试通过')
else:
print('测试不通过')
符合预期:它本身就是要显示不通过的 显示不通过了 就是符合预期
模块和包概念
import unittest
class TestDome1(unittest.TestCase):
def test_method1(self):
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')
import unittest
from d106 import TestDome1
from d107 import TestDemo2
suite = unittest.TestSuite()
suite.addTest(TestDome1('test_method1'))
suite.addTest(TestDome1('test_method2'))
suite.addTest(TestDemo2('test_method1'))
suite.addTest(TestDemo2('test_method2'))
runner = unittest.TextTestRunner()
runner.run(suite)
import unittest
from d106 import TestDome1
from d107 import TestDemo2
suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestDome1))
suite.addTest(unittest.makeSuite(TestDemo2))
runner = unittest.TextTestRunner()
runner.run(suite)
练习:
def login(username,password):
if username == 'admin' and password == '123456':
return "登录成功"
else:
return "登录失败"
import unittest
import d110
class TestLogin(unittest.TestCase):
def test_method1(self):
username = 'admin'
password = '123456'
if d110.login(username,password) == '登录成功':
print("pass")
else:
print('fall')
def test_method2(self):
username = 'root'
password = '123456'
if d110.login(username,password) == '登录失败':
print("pass")
else:
print('fall')
def test_method3(self):
username = 'admin'
password = '123123'
if d110.login(username,password) == '登录失败':
print("pass")
else:
print('fall')
def test_method4(self):
username = 'aaa'
password = '123123'
if d110.login(username,password) == '登录失败':
print("pass")
else:
print('fall')
TestLoader
"""TestLoader"""
import unittest
# 1.用例所在所在路径 2.用例的代码文件名
suite = unittest.TestLoader().discover('./case','ww*.py')
# runner = unittest.TextTestRunner()
# runner.run(suite)
unittest.TextTestRunner().run(suite)
"""TestLoader"""
import unittest
# 1.用例所在所在路径 2.用例的代码文件名
suite = unittest.defaultTestLoader.discover('./case','ww*.py')
# runner = unittest.TextTestRunner()
# runner.run(suite)
unittest.TextTestRunner().run(suite)
就一个是自己创的一个是默认的
同一目录下
suite = unittest.defaultTestLoader.discover('.','ww*.py')
Fixture
方法级别:每个测试方法前后执行一次 类级别:每个类来一次
1,5执行一次
2,3,4小循环
Fixture 是写在UnitTest里面写的
import unittest
class TestLogin(unittest.TestCase):
def setUp(self):
"""每个测试方法执行之前会使用的方法"""
print('输入网址')
def tearDown(self) -> None:
"""每个测试方法执行之后会使用的方法"""
print('关闭当前页面')
@classmethod
def setUpClass(cls) -> None:
print('---------打开浏览器')
@classmethod
def tearDownClass(cls) -> None:
print('----------关闭浏览器')
def test_1(self):
print('输入1')
def test_2(self):
print('输入2')
断言
assertEqual(预期结果,实际结果)
判断预期结果和实际结果是否相等
如果相等 用例通过
如果不相同 用例不通过 抛出异常
assertIn(预期结果,实际结果)
判断预期结果是否包含在实际结果中
1.包含,用例通过
2.不包含,用例不通过,抛出异常
缺点:只能在unitcase中用 生成测试报告
核心:预期和实际结果不一样 就是失败了 就是用例不通过
def test_method4(self):
username = 'aaa'
password = '123123'
# self.assertEqual('登录失败', d110.login(username, password))
self.assertIn('失败',d110.login(username, password))
参数化
pip list 查看所安装的包
from parameterized import parameterized
import unittest
from d110 import login
data = [
('admin','123456','登录成功'),
('root','123456','登录失败'),
('admin','123123','登录失败'),
('aaa','123123','登录失败')
]
class TestLogin(unittest.TestCase):# 在这里运行
@parameterized.expand(data)
def test_login(self,username,password,expect):
self.assertEqual(expect, login(username,password))
直接导入json
[
{
"desc": "错误的用户名",
"username": "root",
"password": "123456",
"expect": "登录失败"
},
{
"desc": "错误的密码",
"username": "admin",
"password": "123123",
"expect": "登录失败"
},
{
"desc": "正确",
"username": "admin",
"password": "123456",
"expect": "登录成功"
}
]
import unittest
from parameterized import parameterized
import json
from d110 import login
def load():
with open('ee.json', 'r', encoding='utf-8') as f:
result = json.load(f)
list = []
for i in result:
list.append((i.get('username'), i.get('password'), i.get('expect')))
return list
class TestDemo(unittest.TestCase):
@parameterized.expand(load())
def test_login(self,username,password,expect):
self.assertEqual(expect,login(username,password))
跳过
@装饰器 1.直接 2.条件 判断条件成立跳过
import unittest
import d110
version = 4.0
class TestLogin(unittest.TestCase):
@unittest.skip('跳过的原因')
def test_method1(self):
username = 'admin'
password = '123456'
self.assertEqual('登录成功',d110.login(username,password))
@unittest.skipIf(version>3.0,'version >3.0 不用测试')
def test_method2(self):
username = 'root'
password = '123456'
self.assertEqual('登录失败', d110.login(username, password))
def test_method3(self):
username = 'admin'
password = '123123'
self.assertEqual('登录失败', d110.login(username, password))
def test_method4(self):
username = 'aaa'
password = '123123'
# self.assertEqual('登录失败', d110.login(username, password))
self.assertIn('失败',d110.login(username, password))
测试报告
import unittest
from HtmlTestRunner import HTMLTestRunner
class MyTest1(unittest.TestCase):
def test_addition(self):
self.assertEqual(1 + 1, 2)
class MyTest2(unittest.TestCase):
def test_subtraction(self):
self.assertEqual(2 - 1, 1)
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(MyTest1))
test_suite.addTest(unittest.makeSuite(MyTest2))
output_file = "test_report.html"
with open(output_file, "w", encoding='utf-8') as file:
runner = HTMLTestRunner(stream=file)
runner.run(test_suite)
import unittest
from HtmlTestRunner import HTMLTestRunner
suite = unittest.defaultTestLoader.discover('./case', 'ww*.py')
file = 'case.html'
with open(file, 'w',encoding='utf-8') as f:
runner = HTMLTestRunner(stream=f,verbosity=2,report_title='测试报告',descriptions='python')
runner.run(suite)