一.自动化测试框架对比
在自动化测试领域,存在多种框架供选择,常见的如:PO 框架、pytest 框架以及下面的 unittest 框架。
1.整理对比
框架名称 | 特点 | 优点 | 适用场景 |
---|---|---|---|
PO 框架 | 将页面元素的定位和操作与测试用例分离 | 减少代码重复,使测试用例更专注于业务逻辑 | 页面元素较多、页面交互复杂的 Web 应用测试 |
pytest 框架 | 具有丰富插件生态,支持灵活的测试用例组织和参数化,简洁的断言方式 | 简单易用,学习成本低,强大的扩展能力 | 广泛适用于各种规模的项目,尤其适合敏捷开发和快速迭代的项目 |
unittest 框架 | 是 Python 标准库的一部分,基于类的测试结构,提供 setUp 和 tearDown 方法 | 稳定性高,与 Python 版本兼容性好,适合构建结构化和规范化的测试代码 | 对代码规范性和稳定性要求较高的项目 |
2.简化整理对比
框架名称 | 特点 | 优点 | 适用场景 |
---|---|---|---|
PO 框架 | 页面元素与用例分离 | 减少重复,专注业务 | Web 应用,页面复杂 |
pytest 框架 | 插件多,灵活 | 易用,扩展强 | 各种规模,敏捷开发 |
unittest 框架 | 标准库,类结构 | 稳定,规范 | 要求高的项目 |
二.自动化unittest框架结构
1.Test Case(测试用例)
Test Case(测试用例): 是最小的测试单元,通常一个测试方法对应一个测试用例。每个测试用例应具有独立性,能够单独运行并验证特定的功能或逻辑。
python
import unittest
class MyTest(unittest.TestCase):
def test_addition(self):
result = 1 + 1
self.assertEqual(result, 2) # 使用断言验证结果
2.Test Suite(测试套件)
Test Suite(测试套件): 多个测试用例或测试套件的集合。它允许将相关的测试用例组织在一起,以便更方便地进行管理和执行。
python
import unittest
# 导入测试用例类
from test_cases import MyTest
# 创建测试套件
suite = unittest.TestSuite()
# 添加测试用例到套件
suite.addTest(MyTest('test_addition'))
3.Test Runner(测试运行器)
Test Runner(测试运行器): 负责执行测试用例,并收集测试结果。它可以将测试结果以不同的形式呈现,如控制台输出、生成测试报告等。
python
import unittest
# 导入测试用例类
from test_cases import MyTest
# 创建测试套件
suite = unittest.TestSuite()
suite.addTest(MyTest('test_addition'))
# 创建并运行测试运行器
runner = unittest.TextTestRunner()
runner.run(suite)
4.Test Fixture(测试夹具)
Test Fixture(测试夹具): 包括测试前的准备工作(如设置初始环境)和测试后的清理工作(如释放资源)。通过 setUp 方法在每个测试用例执行前进行准备,tearDown 方法在测试用例执行后进行清理。
python
import unittest
class MyTest(unittest.TestCase):
def setUp(self):
# 在每个测试方法之前执行的设置代码
pass
def tearDown(self):
# 在每个测试方法之后执行的清理代码
pass
def test_something(self):
# 具体的测试逻辑
self.assertEqual(1 + 1, 2)
#运行测试用例
if __name__ == '__main__':
unittest.main()
三.断言方法
unittest
提供了多种断言方法,用于验证测试结果是否符合预期,例如 assertEqual
、assertTrue
、assertFalse
等。
1.assertEqual(a, b): 验证 a 和 b 是否相等。
python
import unittest
class MyTest(unittest.TestCase):
def test_assert_equal(self):
self.assertEqual(2 + 2, 4)
2.assertTrue(condition)
: 验证条件 condition
是否为真。
python
import unittest
class MyTest(unittest.TestCase):
def test_assert_true(self):
self.assertTrue(5 > 3)
3.assertFalse(condition): 验证条件 condition 是否为假。
python
import unittest
class MyTest(unittest.TestCase):
def test_assert_false(self):
self.assertFalse(1 > 2)
除了上述提到的断言方法,unittest 还提供了许多其他的断言方法,如 assertGreater(a, b) 用于验证 a 是否大于 b ,assertIn(item, container) 用于验证 item 是否在 container 中等等,以满足不同的测试验证需求
四.代码示例
1.unittest四种方法
python
import unittest
import time
from 自动化unittest框架.unittest框架.HTMLTestRunner3_New import HTMLTestRunner
class Cms(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
print("类的开始")
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法结束")
def test1_login(self):
print("5")
def test2_yh(self):
print("6")
def testa(self):
print("b")
def testA(self):
print("8")
def dy(self):
print("独有")
if __name__ == '__main__':
# 第一种执行方法,执行全部的用例<br><br>结果
# unittest.main()
# 第二种运行方式,执行单个用例或指定的用例
# tj=unittest.TestSuite()
# # tj.addTest(Cms("testa"))
# tj.addTests([Cms("testa"),Cms("testA")])
# unittest.TextTestRunner().run(tj)
# 第三种运行方式,运行路径下的用例
# path=r'E:\app\PyCharm\pydaima\demo01\自动化unittest框架\unittest框架'
# d=unittest.TestLoader().discover(start_dir=path,pattern="python*.py")
# unittest.TextTestRunner().run(d)
# 第四种运行方式,自动运行路径下的用例
path=r'E:\app\PyCharm\pydaima\demo01\自动化unittest框架\unittest框架'
bgpath=r'E:\app\PyCharm\pydaima\demo01\自动化unittest框架\unittest框架'
sj=time.strftime("%y-%m-%d %H-%M-%S")
d=unittest.TestLoader().discover(start_dir=path,pattern="x04自动框架*.py")
print(d)
file=bgpath+"/"+str(sj)+"ui.html"
f=open(file,"bw")
HTMLTestRunner(
stream=f,description="自动化执行情况",title="ui自动化测试用例",
tester="jc"
).run(d)
2.示例代码
python
import unittest
import requests
import datetime # 导入datetime模块
from HTMLTestRunner3_New import HTMLTestRunner
class cms_jk(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.s=requests.session()
@classmethod
def tearDownClass(cls) -> None:
print("类的结束")
def setUp(self) -> None:
print("方法的开始")
def tearDown(self) -> None:
print("方法结束")
def test1_dl(self):
url = r"http://192.168.10.132:8080/cms/manage/loginJump.do"
data={'userAccount':'admin','loginPwd':'123456'}
headers={"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}
dx=self.s.request(method="post",url=url,data=data,headers=headers)
print(dx.text)
# 可以添加一些断言来判断请求是否成功,比如判断响应状态码是否为200等
self.assertEqual(dx.status_code, 200)
def test2_yh(self):
url2 = r"http://192.168.10.132:8080/cms/manage/queryUserList.do"
data2={
"startCreateDate":"",
"endCreateDate":"",
"searchValue":"",
"page":1
}
headers2={"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}
dx2=self.s.request(method="post",url=url2,data=data2,headers=headers2)
print(dx2.text)
self.assertEqual(dx2.status_code, 200)
def dy(self):
print("独有")
if __name__ == '__main__':
# unittest.main()
lj=r"E:\app\PyCharm\pydaima\demo01\自动化unittest框架\接口报告"
bgllj=r"E:\app\PyCharm\pydaima\demo01\自动化unittest框架\接口报告"
d = unittest.TestLoader().discover(start_dir=lj,pattern="jkbg01*.py")
new = datetime.datetime.now().strftime("%y-%m-%d_%H-%M-%S")
file = bgllj + "/" + new + "_jk.html"
f = open(file, "bw")
HTMLTestRunner(
stream=f, description="用例执行情况", title="接口自动化测试",
tester="jc"
).run(d)
3.生成报告
生成报告后,点击查看详情(见附加材料)
整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!