自動(dòng)化測(cè)試:所有采用程序或代碼來替代或輔助人工測(cè)試的行為稱為自動(dòng)化測(cè)試。
自動(dòng)化測(cè)試好處:提升工作效率
主要應(yīng)用環(huán)節(jié):回歸測(cè)試、兼容性測(cè)試、冒煙測(cè)試
適合自動(dòng)化測(cè)試的項(xiàng)目特點(diǎn):
1、項(xiàng)目需求穩(wěn)定
2、項(xiàng)目周期較長(zhǎng)
3、腳本可以重復(fù)使用
selenium:是由thoughtworks公司2004年左右開發(fā)的基于瀏覽器的自動(dòng)化測(cè)試工具,提供了一整套的用于
????????? web UI自動(dòng)化的函數(shù)。
?? ?組成:webdriver:基于瀏覽器的自動(dòng)化測(cè)試工具,提供了一整套的用于web UI自動(dòng)化的函數(shù)。
?? ?????? selenium IDE:firefox瀏覽器的插件,可以錄制腳本,selenium3.0已被淘汰。
?? ??? ?? selenium grid:用于管理和執(zhí)行自動(dòng)化測(cè)試用例(課程中講jenkins)
?? ?
?? ?selenium是一個(gè)C/S模式工具,腳本是C端,瀏覽器是S端,使用json wire協(xié)議。
搭建自動(dòng)化測(cè)試環(huán)境:
1、安裝python和編譯器
2、安裝瀏覽器,將瀏覽器的安裝路徑添加到path變量中。
3、將瀏覽器的驅(qū)動(dòng)文件存放路徑添加到path變量中
4、導(dǎo)入selenium庫(kù)(pip install selenium)
?? ??? ?離線導(dǎo)入:下載selenium tar包,解壓。
?? ??? ??????????? python setup.py build
?? ??? ??? ??? ??? python setup.py install
注意:瀏覽器驅(qū)動(dòng)文件與瀏覽器版本需要匹配,工作中瀏覽器版本不能頻繁升級(jí)
chrome瀏覽器驅(qū)動(dòng)文件下載地址:http://chromedriver.storage.googleapis.com/index.html
https://npm.taobao.org/mirrors/chromedriver
火狐瀏覽器驅(qū)動(dòng)文件對(duì)應(yīng)地址:https://firefox-source-docs.mozilla.org/testing/geckodriver/Support.html
?????????????????? 下載地址:? https://github.com/mozilla/geckodriver/releases
edge瀏覽器驅(qū)動(dòng)文件下載地址:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
元素定位:
定位方法:
find_element():單元素定位,返回值為定位到的元素對(duì)象
find_elements():多元素定位,返回值為列表,列表中是定位到的元素對(duì)象
八種元素定位方式:
1、id定位:find_element(By.ID,'id屬性值')
2、name定位:find_element(By.NAME,'name屬性值')
3、class定位:find_element(By.CLASS_NAME,'name屬性值')
?? ??? ??? ?class屬性值中有空格時(shí)必須使用點(diǎn)代替
4、tag定位:find_element(By.TAG_NAME,'元素的標(biāo)簽值')
5、link_text定位:find_element(By.LINK_TEXT,'超鏈接文字')
6、partial_link_text定位:find_element(By.PARTIAL_LINK_TEXT,'超鏈接部分文字')
7、css定位:find_element(By.CSS_SELECTOR,'css值')
8、xpath定位:find_element(By.XPATH,'xpath值')
Day2:
frame框架(標(biāo)簽是iframe或frame)切換:
切換方法:
切入框架:?? ?switch_to.frame()
?? ?1、id切入:switch_to.frame('frame框架id屬性值')
?? ?2、name切入:switch_to.frame('frame框架name屬性值')
?? ?3、先定位frame框架,再切入:switch_to.frame(frame框架對(duì)象)
?? ?4、索引切入:switch_to.frame(索引值)
?? ?注意:frame框架存在嵌套的情況下需要一層一層切入
返回父框架:switch_to.parent_frame()
切出框架:switch_to.default_content()
網(wǎng)頁(yè)切換:
1、獲取打開網(wǎng)頁(yè)的句柄,得到一個(gè)由網(wǎng)頁(yè)對(duì)象組成的列表,按照網(wǎng)頁(yè)打開順序,索引從0開始
handles = driver.window_handles
2、切換網(wǎng)頁(yè):switch_to.window(handler[索引值])
3、close():關(guān)閉網(wǎng)頁(yè)
網(wǎng)頁(yè)常用操作:
網(wǎng)頁(yè)最大化:maximize_window(),避免由于沒有最大化顯示,網(wǎng)頁(yè)上元素堆疊,影響元素定位。瀏覽器打開后第一件事情就是網(wǎng)頁(yè)最大化。
網(wǎng)頁(yè)最小化:minimize_window()
設(shè)置網(wǎng)頁(yè)大?。簊et_window_size(1024,768)
網(wǎng)頁(yè)刷新:refresh()
網(wǎng)頁(yè)前進(jìn):forword()
網(wǎng)頁(yè)后退:back()
獲取網(wǎng)頁(yè)的url:current_url
獲取網(wǎng)頁(yè)的標(biāo)題:titile
網(wǎng)頁(yè)截圖:get_screenshot_as_file()
頁(yè)面元素常用操作:
1、獲取元素上的文字:text
2、獲取元素的屬性值:get_attribute()
3、清除元素內(nèi)容:clear() ,避免由于瀏覽器緩存,造成重復(fù)輸入,原則上輸入前都清除一下
4、判斷元素是否被選中:is_selected()
5、判斷元素是否顯示:is_displayed()
6、判斷元素是否可用:is_enabled()
鼠標(biāo)模擬操作:
在ActionChains庫(kù)中提供了模擬鼠標(biāo)操作的方法
鼠標(biāo)右擊:context_click()
鼠標(biāo)雙擊:double_click()
鼠標(biāo)懸停:move_to_element()
按住鼠標(biāo)不松開:click_and_hold()
拖拽某個(gè)元素一定的距離:drag_and_drop_by_offset()
拖拽某個(gè)元素到另一個(gè)元素上:drag_and_drop()
移動(dòng)鼠標(biāo)距離某個(gè)元素左上角一定像素的位置上:move_to_element_with_offset()
發(fā)送某些鍵到當(dāng)前焦點(diǎn)元素:send_keys()
點(diǎn)擊當(dāng)前焦點(diǎn)元素:click()
松開鼠標(biāo):release()
執(zhí)行以上動(dòng)作:perform()
火狐瀏覽器下像素距離測(cè)量插件:Measure-it
警告窗口處理:
1、切入警告窗口,獲取窗口對(duì)象
alert_window = switch_to.alert
2、點(diǎn)擊確定:alert_window.accept()
3、點(diǎn)擊取消:alert_window.dismiss()
4、獲取提示信息:alert_window.text
5、發(fā)送鍵:alert_window.send_keys()
模擬鍵盤操作:
send_keys(Keys.xxx)
下拉菜單操作:
1、直接定位子菜單,通過點(diǎn)擊選擇
2、當(dāng)無法直接定位子菜單時(shí),可以采取二次定位方式,先定位子菜單的上層元素,再定位子菜單
?? ?find_element().find_element()
3、對(duì)于標(biāo)簽為select的元素(一般是下拉菜單或多選框),可以使用select類下的方法來選擇。
常用的方法:
select_by_index():通過索引選擇
select_by_value():通過value屬性值選擇
select_by_visible_text():通過文字選擇
deselect_all():取消所有選擇
deselect_by_index():通過索引取消選擇,適用于多選的情況
deselect_by_value():通過value屬性值取消選擇,適用于多選情況
deselect_by_visible_text():通過文字取消選擇,適用于多選情況
first_select_option: 返回第一個(gè)選擇
all_select_options:返回所有選擇
注意:用select類下的方法操作下拉菜單或多選框時(shí),需要先定位下拉菜單或多選框
java script應(yīng)用:
在ui自動(dòng)化測(cè)試過程中,可能會(huì)通過改變?cè)氐膶傩灾祷騽h除元素的某個(gè)屬性值來達(dá)到簡(jiǎn)化操作的目的。
常用方法:刪除元素的屬性值、修改元素的屬性值、添加屬性值
1、刪除元素屬性js:
js = 'arguments[0].removeAttribute();'
2、修改元素的屬性值、添加屬性值(屬性存在就是修改,屬性不存就是添加):
js = 'arguments[0].setAttribute();'
3、滾動(dòng)瀏覽器的滾動(dòng)條:
'window.scrollTo();'
4、移動(dòng)滾動(dòng)條到某個(gè)元素可以顯示出來的位置
'arguments[0].scrollIntoView();'
文件上傳:
1、如果文件路徑輸入框的type屬性為file,可以定位文件路徑輸入框,使用send_keys()將上傳文件
?? 的路徑及名稱填入輸入框,點(diǎn)擊上傳,實(shí)現(xiàn)上傳操作。
2、使用win32gui庫(kù)和win32con下的方法實(shí)現(xiàn)上傳。
?? 需要 pip install pypiwin32
? ?
文件下載:
opt = webdriver.ChromeOptions()? # 實(shí)例化ChromeOptions類對(duì)象
prefs = {"download.default_directory":"D:\jnc\selenium_0630"}? # 設(shè)置下載的默認(rèn)路徑
opt.add_experimental_option('prefs',prefs)
driver = webdriver.Chrome(options=opt)
等待設(shè)置:
強(qiáng)制等待sleep():使用起來最簡(jiǎn)單的一種等待方式。確定很明顯就是設(shè)置短了不管用,時(shí)間設(shè)置長(zhǎng)了又浪費(fèi)時(shí)間。
隱式等待implicitly_wait():隱式等待是設(shè)置一個(gè)等待時(shí)間,等待網(wǎng)頁(yè)是否加載完成,如果在設(shè)置的等待時(shí)間內(nèi)
網(wǎng)頁(yè)加載完成,則會(huì)立刻執(zhí)行后續(xù)腳本,不會(huì)等完設(shè)置的時(shí)間,如果在設(shè)置的時(shí)間內(nèi)網(wǎng)頁(yè)沒有加載完成,則會(huì)超
時(shí)報(bào)錯(cuò)。隱式等待依然存在浪費(fèi)時(shí)間的情況,因?yàn)楝F(xiàn)在網(wǎng)頁(yè)都是隨時(shí)間局部加載的,只要所需的元素加載出來就
可以執(zhí)行后續(xù)腳本了,不需要等完整個(gè)網(wǎng)頁(yè)的加載的,但是隱式等待是必須等完整個(gè)頁(yè)面加載完成,所以依然存
在浪費(fèi)時(shí)間的情況。隱式等待在整個(gè)瀏覽器的驅(qū)動(dòng)周期內(nèi)只需要設(shè)置一次。
顯示等待webdriverwait():顯示等待可以結(jié)合until()方法,在until方法中設(shè)置等待條件,在webdriverwait()中設(shè)置
等待時(shí)間和間隔時(shí)間(默認(rèn)0.5秒),按照設(shè)置的間隔時(shí)間每隔一定時(shí)間判斷一下等待條件是否成立,成立則立刻執(zhí)行后續(xù)腳本,不會(huì)等完設(shè)置的等待時(shí)間,如果在設(shè)置的等待時(shí)間內(nèi)條件一直不成立,則超時(shí)報(bào)錯(cuò)。在until中可以設(shè)置多種等待條件滿足各種等待場(chǎng)景,例如等待某個(gè)元素是否出現(xiàn),出現(xiàn)立刻執(zhí)行后續(xù)腳本,判斷框架是否可以切入,可以則直接切入。
在expected_conditions模塊下,提供了各種各樣的等待條件,可以形成豐富的等待場(chǎng)景。
常用動(dòng)態(tài)等待條件(方法):
title_is():判斷當(dāng)前頁(yè)面的標(biāo)題是否等于某個(gè)字符串,相等則條件成立,成立返回bool值,如果在設(shè)置的等待時(shí)間內(nèi)條件一直不成立,則超時(shí)報(bào)錯(cuò)。
title_contains():判斷當(dāng)前頁(yè)面的標(biāo)題是否包含某個(gè)字符串,相等則條件成立,成立返回bool值,如果在設(shè)置的等待時(shí)間內(nèi)條件一直不成立,則超時(shí)報(bào)錯(cuò)。
presence_of_element_located():判斷某個(gè)元素是否出現(xiàn),傳參為元組,例(By.ID,"ID值"),返回值為定位到的元素。
在設(shè)置的等待時(shí)間內(nèi),元素出現(xiàn)則返回元素對(duì)象,否則超時(shí)報(bào)錯(cuò)。
visibility_of_element_located():判斷某個(gè)元素是否出現(xiàn)且元素為非隱藏且寬和高不為0的元素,傳參為元組,例(By.ID,"ID值"),返回值為定位到的元素。
在設(shè)置的等待時(shí)間內(nèi),元素出現(xiàn)則返回元素對(duì)象,否則超時(shí)報(bào)錯(cuò)。
presence_of_all_elements_located():判斷多個(gè)元素是否出現(xiàn),傳參為元組,例(By.ID,"ID值"),返回值為定位到的元素組成的列表。在設(shè)置的等待時(shí)間內(nèi),元素出現(xiàn)則返回元素對(duì)象組成的列表,否則超時(shí)報(bào)錯(cuò)。
visibility_of_all_elements_located():判斷多個(gè)元素是否出現(xiàn)且元素為非隱藏且寬和高不為0的元素,傳參為元組,例(By.ID,"ID值"),返回值為定位到的元素組成的列表。在設(shè)置的等待時(shí)間內(nèi),元素出現(xiàn)則返回元素對(duì)象組成的列表,否則超時(shí)報(bào)錯(cuò)。
element_to_be_clickable():判斷元素是否可以點(diǎn)擊,傳參為元組,例(By.ID,"ID值"),返回值為定位到的元素。
在設(shè)置的等待時(shí)間內(nèi),元素出現(xiàn)則返回元素對(duì)象,否則超時(shí)報(bào)錯(cuò)。
frame_to_be_available_and_switch_to_it():判斷某個(gè)框架是否可以切入,可以則直接切入。傳參為元組,條件成立
返回bool值,如果設(shè)置時(shí)間內(nèi)一直不成立則超時(shí)報(bào)錯(cuò)。
alert_is_present():判斷警告窗口是否出現(xiàn),出現(xiàn)則返回警告窗口對(duì)象。
text_to_be_present_in_element():判斷某個(gè)元素的文字中是否包含某個(gè)字符,傳參為一個(gè)元組和一個(gè)字符串,如果包含
則返回bool值,在設(shè)置的等待時(shí)間內(nèi)條件一直不成立則超時(shí)報(bào)錯(cuò)
text_to_be_present_in_element_value():判斷某個(gè)元素的value屬性值中是否包含某個(gè)字符,傳參為一個(gè)元組和一個(gè)字符串,如果包含
則返回bool值,在設(shè)置的等待時(shí)間內(nèi)條件一直不成立則超時(shí)報(bào)錯(cuò)
框架搭建:提升代碼的復(fù)用性和可維護(hù)性,提升工作效率。
搭建框架步驟:
1、規(guī)劃框架的分層? 2、采用什么自動(dòng)化測(cè)試的思想或模式 3、編碼
框架分層:
第一層(基礎(chǔ)功能層):實(shí)現(xiàn)頁(yè)面動(dòng)作(AW?? actionword)的? 封裝、實(shí)現(xiàn)日志輸出、測(cè)試數(shù)據(jù)讀取、配置數(shù)據(jù)讀取、數(shù)據(jù)庫(kù)SQL執(zhí)行等功能
第二層(頁(yè)面層):在第一層的基礎(chǔ)上,基于第一層所封裝的方法或函數(shù),采用po模式,將每個(gè)頁(yè)面看做一個(gè)獨(dú)立
??????? 的對(duì)象,把頁(yè)面上的操作步驟進(jìn)行封裝。
第三層(業(yè)務(wù)流程層):在第二層基礎(chǔ)上,組合不同頁(yè)面上的操作步驟方法,形成不同的業(yè)務(wù)流程。
基于第三層編寫用例。
po(page object)模式:把每一個(gè)頁(yè)面看做一個(gè)獨(dú)立對(duì)象,將頁(yè)面上元素的定位方式定義為屬性,頁(yè)面上的操作步驟
?????????????????????? 封裝為方法。
數(shù)據(jù)驅(qū)動(dòng):測(cè)試數(shù)據(jù)記錄在excecl文件中,自動(dòng)化測(cè)試腳本按照測(cè)試數(shù)據(jù)編寫,最終的體現(xiàn)就是腳本是按照數(shù)據(jù)執(zhí)行。
pytest框架:
是一個(gè)第三方的python單元測(cè)試框架,適用于python的單元測(cè)試,也適用于自動(dòng)化測(cè)試。可以通過插件擴(kuò)展功能。
安裝pytest:pip install pytest
pytest框架用例編寫規(guī)則:
1、.py格式用例文件命名時(shí)必須以test_開頭或以_test結(jié)尾。
2、測(cè)試用例類命名必須以Test開頭
3、測(cè)試用例函數(shù)和測(cè)試用例方法命名必須以test_開頭
?? ?(測(cè)試用例在pytest框架下,可以定義為函數(shù)也可以定義為方法)
4、pytest框架下,斷言使用assert。
需要定義前置方法和后置方法:
前置方法setup():定義所有用例執(zhí)行前的公共的操作,例如:驅(qū)動(dòng)瀏覽器,實(shí)例化某些類的對(duì)象
后置方法teardown():定義所有用例執(zhí)行后的公共的操作,例如:關(guān)閉瀏覽器
在.py文件中執(zhí)行用例,可以使用
pytest.main(['-s','XXXXXXX.py']),-s:允許用例執(zhí)行時(shí)輸出一些執(zhí)行信息。-q:簡(jiǎn)單化輸出執(zhí)行信息
斷言的機(jī)制:
當(dāng)用例執(zhí)行完成,如果系統(tǒng)中沒有捕獲到任何異常,則用例pass,如果系統(tǒng)捕獲到AssertionError異常,
用例被標(biāo)識(shí)為failed。如果用例執(zhí)行失敗,系統(tǒng)捕獲到非AssertionError異常,用例標(biāo)識(shí)為error。
pytest框架下的前置方法和后置方法:
setup_module(),teardown_module():整個(gè)模塊中的用例執(zhí)行前和執(zhí)行后只執(zhí)行一次
setup_function(),teardown_function():每一個(gè)定義為函數(shù)的測(cè)試用例執(zhí)行前和執(zhí)行后各執(zhí)行一次
setup_class(),teardown_class():整個(gè)類中的用例執(zhí)行前和執(zhí)行后只執(zhí)行一次
setup(),teardown():類中的用例每個(gè)用例執(zhí)行前和執(zhí)行后各執(zhí)行一次
setup_method(),teardown_method():類中的用例每個(gè)用例執(zhí)行前和執(zhí)行后各執(zhí)行一次
pytest插件網(wǎng)站:https://docs.pytest.org/en/latest/reference/plugin_list.html
1、pytest 控制用例執(zhí)行順序
?? ?在用例上使用裝飾器來控制用例執(zhí)行順序
?? ?插件名稱:pytest-ordering
?? ?安裝:pip install pytest-ordering
?? ?使用方法:在測(cè)試用例上添加裝飾器@pytest.mark.run(order=x)
?? ?order參數(shù)的值決定用例的執(zhí)行順序,可以是正數(shù)可以是負(fù)數(shù),
?? ?正負(fù)數(shù)都有的情況下優(yōu)先執(zhí)行正數(shù)。
?? ?執(zhí)行優(yōu)先級(jí):正數(shù)>沒有設(shè)置優(yōu)先級(jí)>負(fù)數(shù),值越小執(zhí)行優(yōu)先級(jí)越高。
2、跳過部分用例執(zhí)行
?? ?使用方法:通過裝飾器控制
?? ?@pytest.mark.skip(reason=None)#無條件跳過
?? ?@pytest.mark.skipif(condition=xxx,reason=None)#有條件跳過
?? ?condition:跳過條件,True則跳過?? reason:跳過的原因
?? ?當(dāng)在skipif中設(shè)置了跳過條件后,必須設(shè)置reason=xxx
3、用例執(zhí)行失敗重新執(zhí)行一定的次數(shù)
?? ?需要導(dǎo)入插件:pip install pytest-rerunfailures
?? ?1、在用例上添加裝飾器:@pytest.mark.flaky(reruns=3)
?? ??? 控制單個(gè)用例重新執(zhí)行
?? ? ?
?? ?2、在pytest.ini文件中添加參數(shù) -- reruns x? # x就是重新執(zhí)行的次數(shù)
?? ??? ?
4、標(biāo)記用例執(zhí)行(指定哪些用例執(zhí)行)
?? ?使用方法:添加裝飾器 pytest.mark.標(biāo)簽名? #標(biāo)簽名由自己定義
?? ?標(biāo)簽名需要在pytest.ini文件中提前配置:
?? ?markers =
?? ??? ?標(biāo)簽1
?? ??? ?標(biāo)簽2
?? ??? ?標(biāo)簽3
?? ?執(zhí)行用例時(shí)pytest命令后加-m參數(shù)
?? ?例:pytest -m 標(biāo)簽名
?? ??? ?pytest -m "標(biāo)簽1 and 標(biāo)簽2"
?? ??? ?pytest -m "標(biāo)簽1 or 標(biāo)簽2"
5、pytest測(cè)試用例參數(shù)化
?? ?使用方法:添加裝飾器
?? ?@pytest.mark.parametrize(arguments,argvalue)
?? ?arguments:參數(shù)名?? argvalue:參數(shù)值
?? ?有幾組參數(shù)用例就會(huì)執(zhí)行幾次
6、pytest下fixture函數(shù)(錨定函數(shù),固定裝置函數(shù)):
?? ?
?? ?
?? ?fixture函數(shù)功能類似于前置方法和后置方法,相對(duì)于setup teardown有明顯的優(yōu)點(diǎn):
?? ?1、有獨(dú)立的命名,通過聲明它從測(cè)試函數(shù)、模塊、類、整個(gè)項(xiàng)目中使用
?? ?2、每個(gè)fixture函數(shù)可以互相調(diào)用
?? ?3、可以對(duì)fixture函數(shù)設(shè)置參數(shù),可以跨類、函數(shù)、模塊使用
?? ?
?? ?
?? ?
定義fixture函數(shù)規(guī)則:
?fixture函數(shù)命名不能以test_開頭,要跟用例區(qū)分
?在函數(shù)上添加裝飾器@pytest.fixture(),來聲明這個(gè)函數(shù)是一個(gè)fixture函數(shù)
?fixture函數(shù)必須定義在conftest.py文件中,conftest.py文件名稱是固定的,pytest會(huì)自動(dòng)識(shí)別該文件,
?該文件放大哪個(gè)目錄下,就對(duì)該目前及其子目錄起作用。例如放到項(xiàng)目的根目錄下,就會(huì)對(duì)整個(gè)項(xiàng)目起到全局的作用。
?fixture函數(shù)使用yield關(guān)鍵字返回值,沒有返回值的化默認(rèn)返回None
?
?在fixture函數(shù)中使用yield關(guān)鍵字區(qū)分前置代碼和后置代碼,yield之前的是前置代碼,之后是后置代碼
?
fixture函數(shù)使用:
1、在測(cè)試用例上添加裝飾器@pytest.mark.usefixtures("fixture函數(shù)名稱")使用使用
2、fixture函數(shù)作為用例的參數(shù)使用
如果fixture函數(shù)需要定義形參,使用request作為形參來接收實(shí)參
如何給fixture函數(shù)傳參:
使用parametrize()裝飾器,將fixture函數(shù)名作為參數(shù),即可傳參
例:@pytest.mark.parametrize('fixture函數(shù)名',[參數(shù)值],indirect=True)
fixture函數(shù)的作用范圍:
在fixture函數(shù)中有個(gè)參數(shù)scope可以控制fixture函數(shù)的作用范圍:
scope參數(shù)的值分別是:session、module、class、function(默認(rèn)值)
session:一次會(huì)話中所有的用例執(zhí)行前和執(zhí)行后執(zhí)行一次前置代碼和后置代碼,可以跨.py文件使用
module:每一個(gè).py文件中所有的用例執(zhí)行前和執(zhí)行后執(zhí)行一次前置代碼和后置代碼
class:每一個(gè)類中所有的用例執(zhí)行前和執(zhí)行后執(zhí)行一次前置代碼和后置代碼
function:每個(gè)函數(shù)或方法執(zhí)行前和執(zhí)行后執(zhí)行一次前置代碼和后置代碼
Allure測(cè)試報(bào)告:
allure是一個(gè)獨(dú)立的測(cè)試報(bào)告庫(kù),可以生成美觀易懂的測(cè)試報(bào)告
安裝:
1、導(dǎo)入alllure包:pip install allure-pytest
2、下載allure的zip包,allure下載地址:https://github.com/allure-framework/allure2/releases
?? ?下載后將zip包解壓,將解壓后的bin目錄添加的path變量中
allure報(bào)告生成:先生成json格式的文件,再將json格式文件轉(zhuǎn)換為html格式。
可以在pytest.ini文件中添加allure報(bào)告生成的參數(shù)及文件生成路徑: --alluredir json格式文件生成路徑文章來源:http://www.zghlxwxcb.cn/news/detail-553724.html
json格式報(bào)告查看:allure serve json格式文件所在目錄
將json格式報(bào)告轉(zhuǎn)換為html格式:
allure generate json格式文件所在目錄 -o html文件所在目錄 --clean
html格式報(bào)告查看:allure open html文件所在目錄文章來源地址http://www.zghlxwxcb.cn/news/detail-553724.html
到了這里,關(guān)于自動(dòng)化測(cè)試筆記(selenium+pytest+Allure)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!