自动化unittest框架

一.自动化测试框架对比

在自动化测试领域,存在多种框架供选择,常见的如: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 提供了多种断言方法,用于验证测试结果是否符合预期,例如 assertEqualassertTrueassertFalse 等。

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.生成报告

生成报告后,点击查看详情(见附加材料)

整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!

相关推荐
一隅论数智17 小时前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
倒头就睡的小比特17 小时前
算法竞赛C++常用的STL
c++·算法
默_笙18 小时前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!18 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_4260039618 小时前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫18 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技18 小时前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读19 小时前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼19 小时前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习