自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

高效Python測(cè)試自動(dòng)化的七個(gè)優(yōu)秀技巧和實(shí)踐

譯文 精選
開(kāi)發(fā) 后端
本人長(zhǎng)期從事Python測(cè)試自動(dòng)化項(xiàng)目工作,積累了一些獲取最佳測(cè)試效果的技巧。下文將分享7個(gè)技巧和最佳實(shí)踐,借助這些內(nèi)容,你將能夠?qū)崿F(xiàn)高效的Python測(cè)試自動(dòng)化。?

譯者 | 晶顏

審校 | 重樓

摘要:Python是測(cè)試自動(dòng)化的最佳編程語(yǔ)言之一,掌握以下7點(diǎn)技巧與最佳實(shí)踐可以進(jìn)一步提升測(cè)試自動(dòng)化的性能。

如果曾使用過(guò)JavaScript、Node或其他編程語(yǔ)言執(zhí)行自動(dòng)化測(cè)試,便會(huì)發(fā)現(xiàn)使用Python進(jìn)行自動(dòng)化測(cè)試要容易得多。Python的易用性、高普及率及其提供的大量庫(kù)使成為測(cè)試自動(dòng)化的最佳編程語(yǔ)言之一。

本人長(zhǎng)期從事Python測(cè)試自動(dòng)化項(xiàng)目工作,積累了一些獲取最佳測(cè)試效果的技巧。下文將分享7個(gè)技巧和最佳實(shí)踐,借助這些內(nèi)容,你將能夠實(shí)現(xiàn)高效的Python測(cè)試自動(dòng)化。

1.根據(jù)項(xiàng)目規(guī)格選擇合適的測(cè)試自動(dòng)化框架

Python自帶測(cè)試自動(dòng)化框架Unittest,但它最適合小項(xiàng)目。如果你期望使用一個(gè)在小型到大型項(xiàng)目中均適用的測(cè)試自動(dòng)化框架,那么Pytest會(huì)是更好的選擇。

Pytest提供了一種結(jié)構(gòu)化高效的方式來(lái)編寫(xiě)測(cè)試用例,以實(shí)現(xiàn)更易于管理和可擴(kuò)展的測(cè)試自動(dòng)化。它還擁有最簡(jiǎn)單的語(yǔ)法和最全面的插件生態(tài)系統(tǒng)。例如,可以使用pytest-xdist進(jìn)行并行測(cè)試執(zhí)行。此外,還可以在Pytest上運(yùn)行用Unittest或Nose 2編寫(xiě)的測(cè)試用例。

如果你需要進(jìn)行更多的機(jī)器人過(guò)程自動(dòng)化(RPA)工作,那么機(jī)器人框架是更好的選擇。該框架的語(yǔ)法主要采用人類語(yǔ)言,使用起來(lái)較為簡(jiǎn)便。對(duì)于Web測(cè)試,還可以將其與其他Python測(cè)試框架(如Selenium)集成。

如果你所在的團(tuán)隊(duì)采用行為驅(qū)動(dòng)開(kāi)發(fā)(BDD)模式,那么Behave是最好的框架。在Behave中,編寫(xiě)非技術(shù)眾可以理解的測(cè)試用例是非常容易的。

總之,建議選擇一個(gè)與團(tuán)隊(duì)使用的技術(shù)棧相匹配的框架,以避免可能出現(xiàn)的溝通障礙。但若你是獨(dú)立開(kāi)展工作,Pytest是最通用最常用的框架。

2.在Selenium中使用WebDriverWait來(lái)解決計(jì)時(shí)問(wèn)題

前文提及可將Pytest與Selenium集成以進(jìn)行Web測(cè)試。Pytest在功能測(cè)試方面表現(xiàn)出色,而Selenium則將Web自動(dòng)化提升到了全新高度,尤其是其強(qiáng)大的WebDriver庫(kù),具備卓越的瀏覽器自動(dòng)化能力。

在Selenium上運(yùn)行測(cè)試時(shí),由于系統(tǒng)需定位元素,必須設(shè)置一段預(yù)設(shè)的等待時(shí)間。一旦預(yù)設(shè)時(shí)間(如10秒)結(jié)束,驅(qū)動(dòng)程序便會(huì)退出。然而,隱式等待存在一定問(wèn)題,因?yàn)椴煌脑厮璧牡却龝r(shí)間各不相同。

因此,相較于依賴隱式等待,更建議將WebDriverWait與expected_conditions結(jié)合使用,通過(guò)創(chuàng)建某些條件,確保在與元素進(jìn)行交互之前,這些條件已得到滿足。

from selenium import Webdriver
from Selenium.Webdriver.common.by import By
from Selenium.Webdriver.support.ui import WebDriverWait
from Selenium.Webdriver.support import expected_conditions as EC

driver = Webdriver.Chrome()

driver.get("https://example.com")

# Wait for the element to be clickable
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "clickableElementId")))

element.click() # Perform action after the element is ready
driver.quit()

若測(cè)試頻繁失敗,并不一定意味著Web應(yīng)用程序存在問(wèn)題,有可能是應(yīng)用程序的代碼或用戶界面發(fā)生了某些變化。為避免因測(cè)試失敗而進(jìn)行過(guò)多的調(diào)試工作,務(wù)必使用唯一的ID來(lái)準(zhǔn)確識(shí)別Web元素。

3.使用Pytest參數(shù)化測(cè)試以避免重復(fù)測(cè)試函數(shù)

Pytest的參數(shù)化測(cè)試特性在節(jié)省時(shí)間方面的作用不容小覷。在測(cè)試自動(dòng)化過(guò)程中,有時(shí)需要使用不同的數(shù)據(jù)集對(duì)應(yīng)用程序中的相同功能進(jìn)行測(cè)試。此時(shí),無(wú)需重復(fù)編寫(xiě)測(cè)試函數(shù),僅需使用pytest.mark.parametrize,便可使單個(gè)測(cè)試函數(shù)使用不同的參數(shù)多次運(yùn)行。示例代碼如下:

import pytest
@pytest.mark.parametrize("input, expected", [(2, 4), (3, 9), (4, 16)])
def test_square(input, expected):
 assert input ** 2 == expected

如果了解是否可以使用Python內(nèi)置的測(cè)試自動(dòng)化框架運(yùn)行參數(shù)化測(cè)試,那么在某些條件下,答案是肯定的。Unittest本身不支持參數(shù)化測(cè)試,但是可以為此添加一個(gè)模塊。具體方法如下所示

import unittest
from parameterized import parameterized
class TestMathOperations(unittest.TestCase):
 @parameterized.expand([
 ("square of 2", 2, 4),
 ("square of 3", 3, 9),
 ("square of 4", 4, 16),
 ])
 def test_square(self, name, input, expected):
 self.assertEqual(input ** 2, expected)

4.通過(guò)并行測(cè)試加速測(cè)試執(zhí)行

測(cè)試套件中的API、測(cè)試用例、數(shù)據(jù)庫(kù)和第三方系統(tǒng)越多,執(zhí)行過(guò)程中產(chǎn)生的延遲就會(huì)越多,這無(wú)疑會(huì)拖慢開(kāi)發(fā)速度。值得慶幸的是,有一種方法可以在不篡改測(cè)試套件的情況下解決這個(gè)問(wèn)題。Python允許使用Pytest等框架進(jìn)行并行測(cè)試,借助此功能,你可以使用多個(gè)CPU并行運(yùn)行多個(gè)測(cè)試。

下面將展示如何使用Pytest執(zhí)行并行測(cè)試:

pip install pytest-xdist
pytest -n 4 # Run tests on 4 CPUs

還可以增加處理負(fù)載的CPU數(shù)量,但是能夠處理負(fù)載的本地基礎(chǔ)設(shè)施有限。如果CPU不足以處理的測(cè)試套件,那么建議使用像Lambda這樣的云平臺(tái)來(lái)測(cè)試應(yīng)用程序在不同瀏覽器和操作系統(tǒng)上的表現(xiàn)。

5.將測(cè)試自動(dòng)化融入CI/CD管道中

請(qǐng)相信,如果處于快節(jié)奏的開(kāi)發(fā)周期中,手動(dòng)調(diào)整代碼的工作將接連不斷,每次軟件發(fā)生變更時(shí),都得手動(dòng)對(duì)代碼進(jìn)行調(diào)整,幾乎沒(méi)有喘息的機(jī)會(huì)。

而將Python測(cè)試自動(dòng)化整合到CI/CD管道中,就能夠在代碼發(fā)生更改時(shí)自動(dòng)執(zhí)行測(cè)試。如此一來(lái),便能快速發(fā)現(xiàn)漏洞,并及時(shí)發(fā)布改進(jìn)后的應(yīng)用版本供用戶使用。

具體操作是把Python測(cè)試自動(dòng)化集成至CI/CD管道里。在項(xiàng)目中添加 Pytest -cov ,通過(guò)Pytest命令自動(dòng)執(zhí)行測(cè)試并標(biāo)記出任何問(wèn)題。具體步驟如下:

- name: Install dependencies
 run: pip install pytest pytest-cov

 - name: Run tests
 run: pytest --cov=my_project

如果你需要處理更大規(guī)模的測(cè)試套件,就需要向諸如Jenkins之類的CI工具添加機(jī)器人框架。對(duì)于Unittest而言,coverage功能可使測(cè)試集成到類似的管道中,示例如下:

script:
 - Python -m coverage run -m unittest discover
 - Python -m coverage report

6.獨(dú)立運(yùn)行測(cè)試

Python測(cè)試自動(dòng)化可能遇到的一個(gè)常見(jiàn)問(wèn)題是,由于測(cè)試之間存在相互依賴關(guān)系而導(dǎo)致測(cè)試中斷。簡(jiǎn)單來(lái)說(shuō),就是因?yàn)槟硞€(gè)測(cè)試依賴于其他測(cè)試的數(shù)據(jù)或環(huán)境條件,所以一旦其中一個(gè)測(cè)試被修改,其他測(cè)試就可能會(huì)因更改引發(fā)的連鎖反應(yīng)而失敗。為解決這一問(wèn)題,需要將所有測(cè)試進(jìn)行隔離,使每個(gè)測(cè)試在開(kāi)始運(yùn)行時(shí)都不與其他測(cè)試產(chǎn)生關(guān)聯(lián)。這樣一來(lái),在進(jìn)行調(diào)試時(shí),就無(wú)需顧慮其對(duì)其他測(cè)試造成的連鎖影響。

以下展示如何在Pytest中運(yùn)用setup和teardown邏輯來(lái)確保測(cè)試隔離:

import pytest
@pytest.fixture
def clean_environment():
 # Setup: Prepare a clean state
 print("Setting up a clean environment.")
 yield
 # Teardown: Reset environment
 print("Cleaning up after the test.")

def test_example(clean_environment):
 assert 2 + 2 == 4

需要注意的是,Pytest fixture會(huì)確保在每次測(cè)試后清理使用的資源這使得在測(cè)試執(zhí)行完畢后,環(huán)境能夠恢復(fù)到初始狀態(tài)。

7.堅(jiān)持最佳測(cè)試自動(dòng)化實(shí)踐原則

在此著重介紹幾個(gè)提高Python測(cè)試自動(dòng)化效率的最佳實(shí)踐方法:

  • 在開(kāi)啟測(cè)試自動(dòng)化工作之前,為測(cè)試套件設(shè)定測(cè)試指標(biāo)。諸如代碼覆蓋率、執(zhí)行的測(cè)試用例數(shù)量、通過(guò)或失敗情況以及測(cè)試執(zhí)行時(shí)間等測(cè)試指標(biāo),有助于跟蹤測(cè)試過(guò)程并確定需要解決的瓶頸問(wèn)題。
  • 團(tuán)隊(duì)中的每位成員在很大程度上都應(yīng)掌握編寫(xiě)端到端(E2E)測(cè)試的方法。如此一來(lái),質(zhì)量便不再是事后才考慮的因素,而是從開(kāi)發(fā)伊始就融入到整個(gè)開(kāi)發(fā)過(guò)程當(dāng)中。
  • 避免對(duì)第三方依賴進(jìn)行測(cè)試,例如那些無(wú)法掌控的外部網(wǎng)站或服務(wù)器鏈接。對(duì)其進(jìn)行測(cè)試可能會(huì)降低測(cè)試速度,而且可能會(huì)存在cookie橫幅或其他導(dǎo)致測(cè)試失敗的元素。
  • 使用斷言來(lái)驗(yàn)證測(cè)試結(jié)果是否與預(yù)期結(jié)果匹配。
  • 及時(shí)更新測(cè)試自動(dòng)化工具,以便在最新的瀏覽器版本上對(duì)應(yīng)用進(jìn)行測(cè)試,從而在應(yīng)用向公眾發(fā)布之前捕獲潛在漏洞。

結(jié)語(yǔ)

自動(dòng)化測(cè)試工作頗具挑戰(zhàn)性,尤其是在面對(duì)一系列看似難以解決的錯(cuò)誤時(shí)。實(shí)踐發(fā)現(xiàn),采用測(cè)試金字塔模式時(shí),測(cè)試自動(dòng)化出現(xiàn)的錯(cuò)誤相對(duì)較少。在此模式下,重點(diǎn)關(guān)注單元測(cè)試和集成測(cè)試,而非端到端測(cè)試。運(yùn)用上述所強(qiáng)調(diào)的技巧和實(shí)踐方法,便能夠在CI/CD環(huán)境中高效地運(yùn)行持續(xù)回歸測(cè)試,并在代碼部署前及時(shí)獲取即時(shí)反饋信息。

原文標(biāo)題:7 Best Tips and Practices for Efficient Python Test Automation,作者:Pradeesh Ashokan

責(zé)任編輯:姜華 來(lái)源: 51CTO
相關(guān)推薦

2021-10-18 13:26:15

大數(shù)據(jù)數(shù)據(jù)分析技術(shù)

2023-01-09 15:20:16

2022-06-10 07:25:41

測(cè)試自動(dòng)化趨勢(shì)

2022-09-12 16:02:32

測(cè)試企業(yè)工具

2024-05-29 11:16:33

PythonExcel

2024-03-08 13:13:05

人工智能自動(dòng)化

2023-11-14 14:25:09

數(shù)據(jù)湖大數(shù)據(jù)

2023-11-28 12:07:06

Python代碼

2022-06-28 05:54:10

機(jī)器身份網(wǎng)絡(luò)攻擊網(wǎng)絡(luò)安全

2022-04-14 10:40:11

領(lǐng)導(dǎo)者IT團(tuán)隊(duì)遠(yuǎn)程團(tuán)隊(duì)

2021-09-07 09:00:00

開(kāi)發(fā)測(cè)試工具

2024-10-11 06:00:00

Python代碼編程

2021-11-05 09:00:00

Selenium工具自動(dòng)化測(cè)試

2021-09-03 09:56:18

鴻蒙HarmonyOS應(yīng)用

2022-05-13 09:16:49

Python代碼

2023-09-20 09:00:00

2022-12-19 14:25:33

2023-11-03 15:24:39

2024-09-25 10:00:00

Python自動(dòng)化辦公

2021-04-02 09:00:00

Node.js開(kāi)發(fā)工具
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)