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

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

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

相关推荐
道不尽世间的沧桑27 分钟前
第17篇:网络请求与Axios集成
开发语言·前端·javascript
久绊A35 分钟前
Python 基本语法的详细解释
开发语言·windows·python
StickToForever3 小时前
第4章 信息系统架构(五)
经验分享·笔记·学习·职场和发展
Hylan_J4 小时前
【VSCode】MicroPython环境配置
ide·vscode·python·编辑器
软件黑马王子4 小时前
C#初级教程(4)——流程控制:从基础到实践
开发语言·c#
莫忘初心丶4 小时前
在 Ubuntu 22 上使用 Gunicorn 启动 Flask 应用程序
python·ubuntu·flask·gunicorn
闲猫4 小时前
go orm GORM
开发语言·后端·golang
计算机小白一个5 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^5 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
李白同学6 小时前
【C语言】结构体内存对齐问题
c语言·开发语言