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

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

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

相关推荐
8Qi813 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
秋913 小时前
Go语言(Golang)开发工程师全景解析:岗位职责·语言优势与使用场景·各城市薪资·发展前景·高考志愿填报(2026版)
开发语言·golang·高考
和平宇宙13 小时前
AI笔记005. hermes-DeepSeek V4 Pro, 128K上下文引发的探索
前端·人工智能·笔记
无风听海14 小时前
多租户系统中的 OIDC:Discovery 端点与联合登录的深度实践
后端·python·flask
十月的皮皮14 小时前
C语言学习笔记20260606- 求月份天数三种写法
c语言·笔记·学习
cmes_love14 小时前
Level 2逐笔成交历史数据下载方法笔记
数据库·笔记·oracle
CTA终结者14 小时前
期货量化主力换月程序怎么移仓:天勤 underlying_symbol 与任务切换
python·区块链
huangdong_14 小时前
1688商品图片采集技术解析:登录态处理与SKU图自动分类
开发语言
马士兵教育14 小时前
Java还有前景吗?Java+AI大模型学习路线及项目?
java·人工智能·python·学习·机器学习
youngerwang14 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片