」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Pytest 自動化您的任務:帶有範例的實用指南

使用 Pytest 自動化您的任務:帶有範例的實用指南

發佈於2024-11-02
瀏覽:243

Automate your tasks Using Pytest: A practical guide with examples

自动化是现代软件开发和测试的关键部分。它可以节省时间、减少人工错误并确保跨流程的一致性。 Pytest 框架是 Python 中最流行、最强大的自动化任务工具之一,特别是在测试方面。它轻量级、易于使用,并提供大量插件和内置功能来简化自动化过程。

在本文中,我们将探索使用 Pytest 框架自动化任务的最佳方法。我们将通过三个实际示例来演示 Pytest 如何有效地自动化不同类型的任务。

为什么选择 Pytest?
在深入示例之前,我们先讨论一下为什么 Pytest 是任务自动化的绝佳选择:

简单性:Pytest 具有简单简洁的语法,可以轻松编写和阅读测试用例。
可扩展性:通过广泛的插件和钩子,Pytest可以扩展以支持不同的测试需求。
Fixtures:Pytest提供了fixtures,这是一个强大的功能,用于设置测试的前提条件或状态,增强可重用性。
集成:Pytest 与其他工具(包括 CI/CD 平台)很好地集成,从而实现端到端自动化。

示例 1:使用 Pytest 自动化 API 测试
API 是许多应用程序的支柱,确保其可靠性至关重要。 Pytest 与 requests 库一起可以轻松实现 API 测试的自动化。

第 1 步:安装所需的库
首先,确保您安装了 Pytest 和 requests 库:

pip install pytest 请求
第2步:编写测试脚本
让我们自动向公共 API(例如 JSONPlaceholder)发送一个简单的 GET 请求,这是一个用于测试的虚假在线 REST API。

`导入请求
导入 pytest

定义基本 URL

BASE_URL = "https://jsonplaceholder.typicode.com"

@pytest.fixture
def api_client():
# 该装置提供了一个用于发出 API 请求的会话对象
会话 = requests.Session()
收益会话
会话.close()

def test_get_posts(api_client):
# 发送 GET 请求来获取帖子
响应 = api_client.get(f"{BASE_URL}/posts")
# 断言
断言response.status_code == 200
断言 len(response.json()) > 0, "未找到帖子"`

解释:
Fixture (api_client):这个fixture设置了一个可重用的会话来发出HTTP请求,确保我们不需要每次都创建一个新的会话。
测试函数 (test_get_posts):此函数向 /posts 端点发送 GET 请求并验证:
状态码为200,表示成功。
回复中至少包含一篇帖子。
第 3 步:运行测试
要执行测试,请运行以下命令:

bash
复制代码
pytest -v test_api.py
为什么这有效
该测试简洁且可重用,利用 Pytest 的装置来处理设置和拆卸。
Pytest 的输出显示哪些测试通过或失败,从而可以轻松跟踪 API 随着时间的推移的可靠性。

示例 2:使用 Pytest 和 Selenium 自动化 Web UI 测试
Web UI 测试可确保应用程序的前端按预期运行。 Pytest 可以与 Selenium 结合来有效地自动化这些任务。

第 1 步:安装所需的库
安装 Pytest、Selenium 和 WebDriver Manager:

pip install pytest selenium webdriver-manager
第2步:编写测试脚本
以下是如何自动执行一个简单的 Web UI 测试来验证 Google 上的搜索功能:

`导入pytest
从硒导入 webdriver
从 selenium.webdriver.common.by 导入 By
从 selenium.webdriver.common.keys 导入 Keys
从 webdriver_manager.chrome 导入 ChromeDriverManager

@pytest.fixture
def browser():
# 设置 Chrome WebDriver
驱动程序 = webdriver.Chrome(ChromeDriverManager().install())
收益驱动因素
driver.quit()

def test_google_search(浏览器):
# 导航至 Google
browser.get("https://www.google.com")`{% endraw %}

# Find the search box and enter a query
search_box = browser.find_element(By.NAME, "q")
search_box.send_keys("Pytest Automation")
search_box.send_keys(Keys.RETURN)

# Assert that results are shown
results = browser.find_elements(By.CSS_SELECTOR, "div.g")
assert len(results) > 0, "No search results found"

解释:
夹具(浏览器):此夹具使用 webdriver-manager 设置 Chrome WebDriver 实例,并确保每次测试后正确关闭它。
测试函数(test_google_search):该函数:
打开 Google 主页。
搜索“Pytest Automation”。
断言搜索至少返回一个结果。
第 3 步:运行测试
使用以下命令执行测试:

{% raw %}pytest -v test_ui.py
为什么这有效
Pytest 的固定装置管理浏览器实例,使测试设置和拆卸干净高效。
使用 Selenium,脚本像真实用户一样与网页交互,确保 UI 按预期运行。
示例 3:使用 Pytest 和 Pandas 自动进行数据验证
数据验证在数据工程、分析和 ETL 过程中至关重要。 Pytest 可以使用 pandas 库自动执行数据验证任务。

第 1 步:安装所需的库
确保安装了 Pytest 和 Pandas:

pip 安装 pytest pandas
第2步:编写测试脚本
让我们自动化执行一个任务,验证数据集是否满足某些条件(例如,没有空值、正确的数据类型等)。

`导入pytest
将 pandas 导入为 pd

@pytest.fixture
def 样本数据():
# 创建一个示例 DataFrame
数据 = {
“姓名”:[“爱丽丝”,“鲍勃”,“查理”,“大卫”],
“年龄”: [25, 30, 35, 40],
“电子邮件”:[“[email protected]”,“[email protected]”,无,“[email protected]”]
}
df = pd.DataFrame(数据)
返回 df

def test_data_not_null(sample_data):
# 检查DataFrame中是否有空值
断言sample_data.isnull().sum().sum() == 0,“数据包含空值”

def test_age_column_type(sample_data):
# 验证'age'列是否为整数类型
断言sample_data['age'].dtype == 'int64',“年龄列不是整数类型”`
解释:
Fixture (sample_data):这个fixture设置一个示例DataFrame,模拟一个可以在多个测试中重复使用的数据集。
测试函数 (test_data_not_null):此测试检查 DataFrame 中是否存在空值,如果发现则失败。
测试函数(test_age_column_type):该测试验证age列是否为整数类型,保证数据的一致性。
第 3 步:运行测试
使用以下命令执行测试:

pytest -v test_data.py
为什么这样有效
Pytest 的灵活性允许以数据为中心的测试,确保数据集满足预期标准。
该夹具可以轻松设置和修改测试数据,而无需重复代码。
使用 Pytest 自动化任务的最佳实践
使用夹具进行安装和拆卸:夹具有助于有效管理安装和拆卸,使您的测试模块化且可重用。
利用插件:Pytest 具有各种插件(例如,用于 HTML 报告的 pytest-html、用于并行执行的 pytest-xdist)来增强您的自动化工作。
参数化测试:使用@pytest.mark.parametrize测试多组数据或输入,减少代码重复。
与 CI/CD 管道集成:将 Pytest 测试与 Jenkins 或 GitHub Actions 等 CI/CD 工具集成以进行持续测试。

结论
Pytest 是一个强大的工具,可自动执行从 API 和 Web UI 测试到数据验证的各种任务。它的简单性、灵活性和广泛的插件支持相结合,使其成为开发人员和 QA 工程师的绝佳选择。通过利用 Pytest 的功能(例如固定装置、参数化以及与 CI/CD 管道的集成),您可以构建健壮、可维护且可扩展的自动化框架。

如果您希望自动化工作流程或增强测试过程,Pytest 是一个很好的起点。测试愉快!

版本聲明 本文轉載於:https://dev.to/mahmad321/automate-your-tasks-using-pytest-a-practical-guide-with-examples-5g1l?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在細胞編輯後,如何維護自定義的JTable細胞渲染?
    在JTable中維護jtable單元格渲染後,在JTable中,在JTable中實現自定義單元格渲染和編輯功能可以增強用戶體驗。但是,至關重要的是要確保即使在編輯操作後也保留所需的格式。 在設置用於格式化“價格”列的“價格”列,用戶遇到的數字格式丟失的“價格”列的“價格”之後,問題在設置自定義單元...
    程式設計 發佈於2025-05-20
  • Java中如何使用觀察者模式實現自定義事件?
    Java中如何使用觀察者模式實現自定義事件?
    在Java 中創建自定義事件的自定義事件在許多編程場景中都是無關緊要的,使組件能夠基於特定的觸發器相互通信。本文旨在解決以下內容:問題語句我們如何在Java中實現自定義事件以促進基於特定事件的對象之間的交互,定義了管理訂閱者的類界面。 以下代碼片段演示瞭如何使用觀察者模式創建自定義事件: args...
    程式設計 發佈於2025-05-20
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。要簡化過程,建議將JSON作為數組而不是對象解析。 執行此操作,將JSON_DECODE函數與第二個參數設置為true:[&&&&& && &&&&& json = JSON = JSON_DECODE($ ...
    程式設計 發佈於2025-05-20
  • 版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    版本5.6.5之前,使用current_timestamp與時間戳列的current_timestamp與時間戳列有什麼限制?
    在時間戳列上使用current_timestamp或MySQL版本中的current_timestamp或在5.6.5 此限制源於遺留實現的關注,這些限制需要對當前的_timestamp功能進行特定的實現。 創建表`foo`( `Productid` int(10)unsigned not ...
    程式設計 發佈於2025-05-20
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-05-20
  • 為什麼HTML無法打印頁碼及解決方案
    為什麼HTML無法打印頁碼及解決方案
    無法在html頁面上打印頁碼? @page規則在@Media內部和外部都無濟於事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: ...
    程式設計 發佈於2025-05-20
  • Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    Async Void vs. Async Task在ASP.NET中:為什麼Async Void方法有時會拋出異常?
    在ASP.NET async void void async void void void void void的設計無需返回asynchroncon而無需返回任務對象。他們在執行過程中增加未償還操作的計數,並在完成後減少。在某些情況下,這種行為可能是有益的,例如未期望或明確預期操作結果的火災和...
    程式設計 發佈於2025-05-20
  • 如何從PHP中的數組中提取隨機元素?
    如何從PHP中的數組中提取隨機元素?
    從陣列中的隨機選擇,可以輕鬆從數組中獲取隨機項目。考慮以下數組:; 從此數組中檢索一個隨機項目,利用array_rand( array_rand()函數從數組返回一個隨機鍵。通過將$項目數組索引使用此鍵,我們可以從數組中訪問一個隨機元素。這種方法為選擇隨機項目提供了一種直接且可靠的方法。
    程式設計 發佈於2025-05-20
  • 如何將來自三個MySQL表的數據組合到新表中?
    如何將來自三個MySQL表的數據組合到新表中?
    mysql:從三個表和列的新表創建新表 答案:為了實現這一目標,您可以利用一個3-way Join。 選擇p。 *,d.content作為年齡 來自人為p的人 加入d.person_id = p.id上的d的詳細信息 加入T.Id = d.detail_id的分類法 其中t.taxonomy ...
    程式設計 發佈於2025-05-20
  • 如何使用替換指令在GO MOD中解析模塊路徑差異?
    如何使用替換指令在GO MOD中解析模塊路徑差異?
    在使用GO MOD時,在GO MOD 中克服模塊路徑差異時,可能會遇到衝突,其中3個Party Package將另一個PAXPANCE帶有導入式套件之間的另一個軟件包,並在導入式套件之間導入另一個軟件包。如迴聲消息所證明的那樣: go.etcd.io/bbolt [&&&&&&&&&&&&&&&&...
    程式設計 發佈於2025-05-20
  • Python元類工作原理及類創建與定制
    Python元類工作原理及類創建與定制
    python中的metaclasses是什麼? Metaclasses負責在Python中創建類對象。就像類創建實例一樣,元類也創建類。他們提供了對類創建過程的控制層,允許自定義類行為和屬性。 在Python中理解類作為對象的概念,類是描述用於創建新實例或對象的藍圖的對象。這意味著類本身是使用...
    程式設計 發佈於2025-05-20
  • 如何在Java字符串中有效替換多個子字符串?
    如何在Java字符串中有效替換多個子字符串?
    在java 中有效地替換多個substring,需要在需要替換一個字符串中的多個substring的情況下,很容易求助於重複應用字符串的刺激力量。 However, this can be inefficient for large strings or when working with nu...
    程式設計 發佈於2025-05-20
  • Python讀取CSV文件UnicodeDecodeError終極解決方法
    Python讀取CSV文件UnicodeDecodeError終極解決方法
    在試圖使用已內置的CSV模塊讀取Python中時,CSV文件中的Unicode Decode Decode Decode Decode decode Error讀取,您可能會遇到錯誤的錯誤:無法解碼字節 在位置2-3中:截斷\ uxxxxxxxx逃脫當CSV文件包含特殊字符或Unicode的路徑逃...
    程式設計 發佈於2025-05-20
  • 如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    如何使用Java.net.urlConnection和Multipart/form-data編碼使用其他參數上傳文件?
    使用http request 上傳文件上傳到http server,同時也提交其他參數,java.net.net.urlconnection and Multipart/form-data Encoding是普遍的。 Here's a breakdown of the process:Mu...
    程式設計 發佈於2025-05-20
  • PHP未來:適應與創新
    PHP未來:適應與創新
    PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。 引言在編程世界中,PHP一直是網頁開發的中流砥柱。作為一個從1994年就開始發展...
    程式設計 發佈於2025-05-20

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3