seldom 是我一直在維護的自動化測試框架。目前GitHub已經 500+ star。
最近在項目中使用Seldom + poium 編寫自動化測試用例。接下來,我就分享一些使用技巧。
如何參數化測試用例
網站的首頁,如上面的導航。於是,開始利用poium編寫元素定位。
from poium import Page, Element
class Homepage(Page):
destination_hk = Element(cass='#id_2&ext', describe="探索目的地-香港")
destination_macau = Element(css='#id_3&ext', describe="探索目的地-澳門")
destination_singapore = Element(css='#6&ext', describe="探索目的地-新加坡")
...
寫着寫着,我發現這樣的用例不可維護,因為這里的導航是由后台配置出來的一個導航,熱門目的地不是固定的,隨國家、語言變化。
修改用例如下:
# page
from poium import Page, Elements
class Homepage(Page):
destination_all = Elements(xpath='//div/div/', describe="所有熱門城市")
# case
import seldom
class TestHomeNav(seldom.TestCase):
"""導航"""
def start(self):
self.open("https://www.shop.com/")
self.hp = HomePageCN(self.driver)
def test_nva_search(self):
# 遍歷城市列表,點擊每一個城市
destinations = self.hp.destination_all
for elem in destinations:
elem.click()
那新的問題來了,這么寫就一條用例,而且,假設其中一個城市配置鏈接錯誤或失效,整個用例失敗,我們很難排查是哪個城市的問題,而且也不利於用例統計。
最后,改進之后的方案。
# page
from poium import Page, Elements
class Homepage(Page):
destination_all = Elements(xpath='//div/div/', describe="所有熱門城市")
# common
def get_destinations_data(url):
"""
獲得熱門目的地的 數量
:return: [(),()]
"""
hp = HomePage(Seldom.driver)
hp.open(url)
destinations = hp.destination_all
destinations_data = []
for i, elem in enumerate(destinations):
destinations_data.append(
(elem.text, i)
)
return destinations_data
# case
import seldom
from seldom import data
base_url = "https://www.shop.com/"
class TestHomeNav(seldom.TestCase):
"""導航"""
def start(self):
self.open(base_url)
self.hp = HomePage(self.driver)
@data(get_destinations_data(base_url))
def test_nva_search(self, name, i):
# 探索目的地
print("city name-->", name)
destinations = self.hp.destination_all
city_name = destinations[i].text
destinations[i].click()
self.assertText(city_name)
這種方案有兩個好處。
- 城市列表變動,不會影響用例的執行。
- 每個城市統計一條用例。
seldom基於unittest的參數化非常簡單和強大,這也是我沒有轉投pytest的最主要原因之一。 pytest的參數化
@pytest.mark.parametrize()
確實不好用,這一點不接受反駁。
用例依賴
這一條用例是我要自動化點擊搜索歷史
。搜索歷史
搜索過才會產生的數據。
# case
import seldom
from seldom import data
from seldom import depend
class TestHomeSearch(seldom.TestCase):
"""搜索"""
def start(self):
self.open(base_url)
self.hp = HomePage(self.driver)
@data([
("case1", "迪士尼"),
("case2", "雙月灣"),
("case3", "上海"),
])
def test_search_a_keyword(self, name, keyword):
"""
搜索:活動、城市
"""
print("case name-->", name)
self.hp.search_input.send_keys(keyword)
self.hp.search_button.click()
self.assertText(f"以下是與“{keyword}”相關的體驗")
@depend("test_search_a_keyword")
def test_search_history(self):
"""
搜索:點擊搜索歷史
"""
history = self.hp.search_history
keyword = history[0].text
history[0].click()
self.assertText(f"以下是與“{keyword}”相關的體驗")
- 搜索再次用到了參數化。
- 通過
@depend()
裝飾器設置依賴上面的用例test_search_a_keyword
,當被依賴的用例失敗時,該用例直接跳過。
UI + 接口自動化混搭驗證
Seldom既支持Web UI自動化,又支持接口。
例如,上面的活動卡片,如何驗證圖片是否顯示。
- 截圖對比
- 提前准備一張對比的圖片,太麻煩,存在對比偏差,活動有被替換的風險。
- 自動截圖,人工檢查截圖,這不叫完全自動化。
- 跑自動化的時候,測試人員盯着看... 這就很離譜了。
<img src="https://gimg2.baidu.com/i/eg_tulip.jpg" alt="雪山" />
先來看看一張圖片的定義。如果一張圖片無法顯示。
- html 代碼寫錯,例如
src
寫成scr
。 - 圖片鏈接失效。
第一種情況概率很低,而且很容易發現,而且是必現。第二種情況就比較麻煩了,可能圖片鏈接一開始是好的,可能因為圖片服務器問題導致圖片丟失。
好了,分析完圖片不可見的情況。那么就可以通過驗證圖片請求來保證圖片是可見的。
import seldom
class TestHomeActivity(seldom.TestCase):
def start(self):
self.open(base_url)
self.hp = HomePageCN(self.driver)
def test_hot_sale_activity(self):
"""
檢查活動活動 圖片
"""
img = self.hp.activity_img.get_attribute("src")
self.get(url=img) # 調用圖片鏈接
self.assertStatusCode(200) # 斷言活動圖片是否可以訪問
通過get_attribute()
獲取元素的src
圖片鏈接,然后,直接self.get()
調用圖片地址,如果返回200
說明圖片可訪問。
是不是web UI和 接口自動化無縫連接。
最后:
https://github.com/SeldomQA/seldom
提供一下GitHub地址,如果有GitHub帳號,歡迎+ star
,最近在使用過程中也在更加積極的完善功能和修復bug。如果你正在開展自動化測試,不妨試試Seldom,他降低了你自己搭建自動化測試項目的成本,提高你編寫和維護用例的速度。