于相关的自动化测试范畴里, 特定框架依靠其有着简洁灵活以及功能强大这般特性, 变成众多开发者跟测试工程师所选用的工具, 不管是小型项目的单元测试, 还是大型项目的集成测试和与之对应的功能测试, 该框架都能够高效地予以应对, 接下来, 那就让我们一同深入去学习此框架,以此开始自动化测试的高效进程。
目录
一、 框架概述
有一个第三方测试框架, 它建立在某种基础之上, 其设计呈现出简洁的特点, 还具备高度的扩展性。将它与标准库里面的框架作比较, 它的语法更为简单直观, 编写测试用例的时候会更加便捷。它拥有丰富的插件生态, 借助插件能够轻易达成像是测试覆盖率统计、测试报告生成、分布式测试等功能, 这极大地提升了测试效率以及灵活性。
1.1 的优势 1.2 应用场景
适用于多种测试场景,包括但不限于:
二、 的安装与环境配置 2.1 安装
在着手启用之前, 要保证你的系统已然安装了环境(建议3.6及更高版本)。能够运用以下指令借助pip包管理器开展安装: 。
pip install pytest完成安装之后, 于命令行里键入 -- , 要是能够准确呈现 的版本讯息, 那就表明安装达成。
2.2 项目结构与测试文件命名规范
为了更利于进行管理以及运行测试用例, 提议依照一定的项目结构还有命名规范来做。一般情况下, 把测试文件放置在跟源代码相对应的目录当中, 并且用test_*.py来为其命名(这里的*是任意具有一定意义的名称)。比如说, 针对一个名为的包来说, 它的测试文件能够放在/tests目录里边, 文件的命名就像.py、.py这样。
用以测试的函数, 其命名存在规范, 通常是以test_作为开头部分, 像这般, 如此一来, 在开展执行测试这个行为的时候, 才能够凭借自动这种方式去识别这些函数, 将其当作是测试用例。
三、编写第一个 测试用例 3.1 简单测试用例示例
假定存在一个简简单单的数学计算模块.py, 其中涵盖加法以及减法函数: 。
# .py
def add(a, b): return a + b def subtract(a, b): return a - b接下来,我们在.py文件中编写对应的测试用例:
# .py
from calculator import add, subtract def test_add(): result = add(2, 3) assert result == 5 def test_subtract(): result = subtract(5, 2) assert result == 3于上述代码里头, 那个和函数便是 的测试用例。语句是用来查验函数返回值是不是契合预期哒。倘若断言失败了, 就会给出详尽的错误信息, 点明实际值与预期值之间的差别。
3.2 运行测试用例
于命令行里进到测试文件所处的目录, 接着执行指令, 会自行发觉并执行全部契合命名规范的测试用例, 且在终端呈现实测结果。实测结果会以简洁清晰的样式展现, 涵盖测试用例的总共数量、通过的数量、失败的数量等信息。
============================= test session starts ============================== platform darwin -- Python 3.9.7, pytest-7.2.0, pluggy-1.0.0 rootdir: /Users/user/projects/my_project collected 2 items test_calculator.py.. [100%] ============================== 2 passed in 0.01s ==============================要是测试用例出现失败情形, 就会给出详尽的错误回溯信息, 以及断言失败的具体内容, 以此帮我们迅速找准问题所在之处。
四、 核心特性详解 4.1 断言()
其所具备的断言功能相当强大, 除去基本的比较断言这种情况(就像 a == b 这样)之外, 还能够支持多种不同的高级断言模式, 举例来说, 会运用结合逻辑运算符去展开复杂条件的判断:
def test_complex_assertion(): x = 10 y = 5 assert x > y and x % 2 == 0在断言失败之际, 会将实际值以及预期值清晰予以显示, 从而便于进行调试。就像上述代码那样倘若x并不满足条件, 便会输出类似于:(False and True)”情况的错误 , 明确地把断言失败的缘由指出来。
4.2 测试装置()
它将是某方面很关键的一个特性, 此特性旨在拿去给用于测试的例子供应稳定不变的初始状况或者来共享相关资源, 它借助那个凭借名叫@.的装饰器定义出来, 能够在多组用于测试的例子里进行反复运用。
比如说, 我们进行一个用户登录功能的测试, 每一个测试用例都要求有一个处于已登录状态的用户对象, 此时能够运用 来达成该用户对象的创建以及管理: 。
import pytest @pytest.fixture def logged_in_user(): # 模拟用户登录,返回用户对象 user = { "username": "test_user", "password": "test_password", "id": 1 } return user def test_user_profile(logged_in_user): assert logged_in_user["username"] == "test_user" def test_user_settings(logged_in_user): assert "password" in logged_in_user在上述代码里, 存在着这样一个东西, 它于每个使用它的测试用例执行之前被调用, 并且会把返回值传递给测试用例当作参数。它还能够拥有作用域, 像函数级、类级、模块级、会话级这样,借助scope参数来进行设置, 以此去满足不同的共享需求。
4.3 参数化测试()
对于同一个测试用例, 参数化测试能够让我们借助不一样的输入数据去多次运行它, 以此提升测试覆盖率, 借助@.mark.装饰器能够达成参数化测试。
仍旧拿.py里的加法函数当作例子而言, 咱能够运用参数化测试之举去测试诸多输入组合。
from calculator import add import pytest @pytest.mark.parametrize("a, b, expected", [ (1, 2, 3), (0, 0, 0), (-1, 1, 0), (10, 20, 30) ]) def test_add_parametrized(a, b, expected): assert add(a, b) == expected代码当中, @.mark.装饰器设定了参数a、b以及预期结果的多组取值, d测试用例对每组参数值会各自执行一回, 极大程度减少了重复编写测试用例的工作量。
4.4 标记(Mark)
标记被用来对测试用例开展分类以及筛选, 我们能够运用@.mark装饰器给测试用例去添加自定义标记, 之后在运行测试之际依照标记来选择执行特定的测试用例。
例如,将一些耗时较长的测试用例标记为slow:
import pytest @pytest.mark.slow def test_slow_operation(): # 模拟一个耗时操作 import time time.sleep(5) assert True实施运行测试操作时, 借助 -m 选项去指定标记名称, 仅运行那些被标记成 slow 的测试用例。
pytest -m slow也能够运用逻辑运算符组合标记, 像是 -m"slow and not", 意味着运行那些被标记成 slow 然而却未曾被标记为的测试用例。
五、高级应用与插件使用 5.1 测试覆盖率统计
借由 - cov插件能够统计测试代码针对源代码的覆盖状况, 助力我们找出未被测试覆盖的代码区域。首先进行 - cov安装: 。
pip install pytest-cov假设我们的项目结构如下:
my_project/ ├── my_package/ │ ├── __init__.py │ ├── module1.py │ └── module2.py └── tests/ ├── test_module1.py └── test_module2.py于命令行里头, 进入到项目根目录之处, 去执行下面这些命令, 以此来生成测试覆盖率报告。
pytest --cov=my_package此命令会去运行全部测试用例, 并且对包之中代码的覆盖率予以统计。要是有生成 HTML 格式可视化报告所需, 那么可使用以下这个命令: 。
pytest --cov=my_package --cov-report html完成执行之后, 于项目根目录之处, 会产生一个目录, 将其中的index.html文件予以打开, 就能够直观地去查看每一个文件、函数的代码覆盖率情形, 还有未被覆盖的代码行了。
5.2 生成美观的测试报告
插件能够生成具备美观特质、详细程度高的测试报告, 以此方便团队成员去查看测试结果, 还要进行安装, 以及安装命令行工具。
pip install allure-pytest# 下载并安装命令行工具,具体安装步骤根据操作系统而定
运行测试之际, 于测试文件里无需额外去编写代码, 只需去添加--选项, 以此来指定报告生成的目录。
pytest --alluredir=allure-results测试完成后,使用 命令行工具生成并打开报告:
allure serve allure-results这时候, 会开启一个属于本地的Web服务器, 它能够自动去打开浏览器, 以此来展示出精美的测试报告, 这份测试报告里涵盖着测试用例的最终执行状况, 还有详细的日志, 以及附件等一系列信息, 借助这些信息便利进行测试成果的分析, 以及对出现问题的精准定位。
六、实战案例:测试一个 Web 应用 6.1 项目背景
假定存在一个特别简易的Flask Web应用, 它具备为用户提供注册以及登录功能的特性。我们会运用特定方式对其实施单元测试, 并且还要进行功能测试。
6.2 安装依赖
pip install flask pytest pytest-flaskflask是插件, 此插件专门用于测试Flask应用, 它提供了许多测试工具, 这些工具很方便。
6.3 编写 Flask 应用代码
# app.py
from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/register', methods=['POST']) def register(): data = request.get_json() username = data.get('username') password = data.get('password') # 这里省略实际的注册逻辑,假设注册成功 return jsonify({"message": "注册成功"}), 201 @app.route('/login', methods=['POST']) def login(): data = request.get_json() username = data.get('username') password = data.get('password') # 这里省略实际的登录逻辑,假设登录成功 if username == "test_user" and password == "test_password": return jsonify({"message": "登录成功"}), 200 return jsonify({"message": "登录失败"}), 4016.4 编写测试用例
# .py
from app import app import pytest @pytest.fixture def client(): app.config['TESTING'] = True with app.test_client() as client: yield client def test_register(client): data = { "username": "new_user", "password": "new_password" } response = client.post('/register', json=data) assert response.status_code == 201 assert response.get_json()["message"] == "注册成功" def test_login_success(client): data = { "username": "test_user", "password": "test_password" } response = client.post('/login', json=data) assert response.status_code == 200 assert response.get_json()["message"] == "登录成功" def test_login_failure(client): data = { "username": "wrong_user", "password": "wrong_password" } response = client.post('/login', json=data) assert response.status_code == 401 assert response.get_json()["message"] == "登录失败"在上边那些测试用例里头, 设立了一个测试客户端, 此客户端是专门用来模拟发送 HTTP 请求的。然后每个测试用例呢, 都是靠着发送请求, 又去查验响应的状态码以及返回数据是不是契合预期的。
要对Flask应用展开全面测试, 以确保注册以及登录功能的正确性, 需借助运行那特定的命令来达成。
七、总结与实践建议
经过对上述内容予以一番学习, 想必大家已然对一种框架有了全方位且深层次的认知。从基础层面的测试用例着手开展编写工作, 直至核心特性的加以运用, 而后延伸至高级插件的进行使用以及实战案例的呈现, 这般种种展现出了极为强大的测试能力以及非常颇高的灵活性。
在实际项目中使用 时,建议遵循以下实践建议:
盼望此篇博客可助力你于自动化测试之途更上层楼, 将框架的优势全然施展, 为项目的质量进行守护。要是你在学习与使用进程中有任何问题或者想法, 欢迎于评论区交流分享!