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

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

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

相关推荐
麦麦鸡腿堡几秒前
Java_MySQL介绍
java·开发语言·mysql
于是我说几秒前
一份Python 面试常见问题清单 覆盖从初级到高级
开发语言·python·面试
shoubepatien几秒前
JavaWeb_Web基础
java·开发语言·前端·数据库·intellij-idea
BoBoZz19几秒前
RotationAroundLine 模型的旋转
python·vtk·图形渲染·图形处理
Kurbaneli4 分钟前
Python金融数据分析革命:Mootdx让通达信数据获取变得如此简单
python
跨境猫小妹8 分钟前
2025 TikTok Shop:从内容爆发到系统化深耕的商业跃迁
大数据·人工智能·算法·产品运营·亚马逊
不穿格子的程序员10 分钟前
从零开始写算法 —— 二叉树篇 1:二叉树的三种遍历(递归实现法)
算法·深度优先·二叉树遍历·fds
吧啦蹦吧14 分钟前
`org.springframework.util.ClassUtils#forName
开发语言·python
CC.GG15 分钟前
【C++】红黑树
java·开发语言·c++
倔强的小石头_16 分钟前
Python 从入门到实战(十):Pandas 数据处理(高效搞定表格数据的 “瑞士军刀”)
人工智能·python·pandas