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

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

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

相关推荐
点云侠1 天前
解决Visual Studio 2022编译工程速度慢的问题
开发语言·c++·ide·算法·计算机视觉·visual studio
THMAIL1 天前
深度学习从入门到精通 - 迁移学习实战:用预训练模型解决小样本难题
人工智能·python·深度学习·算法·机器学习·迁移学习
脚踏实地的大梦想家1 天前
【Go】P2 Golang 常量与变量
开发语言·后端·golang
张璐月1 天前
go docker-compose启动前后端分离项目 踩坑之旅
开发语言·docker·golang
.鱼子酱1 天前
机器学习 - 使用 ID3 算法从原理到实际举例理解决策树
算法·决策树·机器学习
和小胖11221 天前
第一讲 Vscode+Python+anaconda 安装
python
和小胖11221 天前
第二讲 Vscode+Python+anaconda 高阶环境配置
ide·vscode·python
禹曦a1 天前
JavaScript性能优化实战指南
开发语言·javascript·性能优化
Swift社区1 天前
Swift 解法详解:LeetCode 371《两整数之和》
开发语言·leetcode·swift
Swift社区1 天前
Swift 解法详解 LeetCode 362:敲击计数器,让数据统计更高效
开发语言·leetcode·swift