前言
做自動化做久了,經常會思考一個問題,到底別人是怎么做的自動化,跟自己的有啥不一樣,看過不少書和資料,都是停留在demo的層面。
真正把自動化做的好的大牛又不屑於分享自己的勞動成果,所以大部分情況就是一群菜雞在群里互啄,停留在初級入門的demo層面上。
到底自動化要達到什么樣的效果呢?這里我把最近的研究成果分享下,有經驗的小伙伴也可以一起交流下。
功能用例
我一直認為一切的自動化用例是基於功能測試用例的, 脫離了功能測試用例,你的代碼寫的再漂亮,那也僅僅是show代碼的。
面試的時候經常會遇到一個問題,一般領導型的面試官會問:你們自動化做到了什么程度?自動化用例覆蓋率達到了多少?
自動化用例覆蓋率是一個很好的衡量標准,比如你功能測試用例有100條,你的自動化用例寫了90條,用例覆蓋率是90%?當然不是!!!
你的自動化用例如果跟功能用例搭不上邊,那都是無效用例,覆蓋率也許是0%,僅僅是你自己瞎寫的!
所以自動化用例是去翻譯你的功能用例 ,一個一個去覆蓋,讓功能case,變成自動化用例的case,一一對應起來的(沒寫過功能用例的,后面就不用看了)。
寫功能用例的平台有很多,比如jira,禪道,testlink等,這里以禪道系統為例,比如我的"編輯文章分類"模塊下了3個用例
其中的一條用例是這樣的,有前置條件,用例的步驟和期望結果,這才是一個標准的用例
自動化用例
功能用例寫完之后,接着是如何去用代碼去實現功能用例,這里用的是pytest框架+allure報告,其中一條用例的部分代碼應該如下
- feature 對應模塊名稱
- story 對應用例的標題
- testcase 對應禪道系統的bug用例url地址,關聯起來
- issue 如果這個用例有bug,應該關聯對應的bug地址
- 用例描述: 對應def下的描述步驟
import allure
# 上海-悠悠,QQ交流群:750815713
# 博客地址:https://www.cnblogs.com/yoyoketang/
@allure.feature("編輯分類文章")
class TestArticleclassify():
'''編輯文章分類'''
@allure.story("登錄-編輯文章分類,重復保存,保存失敗")
@allure.issue("http://49.235.92.12:8080/zentao/bug-view-1.html") # 禪道bug地址
@allure.testcase("http://49.235.92.12:8080/zentao/testcase-view-5-1.html") # 禪道用例連接地址
def test_edit_classify5(self, login):
'''用例描述:編輯文章分類-輸入重復的分類,保存失敗,不能添加重復的
setup: 登錄login
step1: 編輯文章分類,輸入文章類別,如:計算機
step2: 點保存按鈕
step3: 重新打開編輯頁,輸入:計算機
step4: 再次點保存按鈕
assert: 保存失敗,提示:已存在
'''
driver = login
edit = ArticleclassifyPage(driver)
edit.click_classify_nav()
edit.edit_classify("計算機")
res2 = edit.is_edit_classify_success("計算機")
print("編輯是否成功:%s"%res2)
assert res2 # 斷言
前置條件:login,應該是單獨抽出來的寫到conftest.py,作為一個前置fixture功能
import pytest
from selenium import webdriver
from pages.login_page import LoginPage
import time
# 上海-悠悠,QQ交流群:750815713
# 博客地址:https://www.cnblogs.com/yoyoketang/
# request 內置的fixture
@pytest.fixture(scope="session")
def driver(request):
'''只打開瀏覽器和關閉瀏覽器'''
driver = webdriver.Chrome()
driver.maximize_window() # 最大化
def end():
print("全部用例執行完后 teardown quit dirver")
time.sleep(5)
driver.quit()
request.addfinalizer(end)
return driver
@pytest.fixture(scope="session")
def login(driver):
web = LoginPage(driver)
web.login()
return driver
LoginPage 頁面的封裝,可以添加操作步驟,step對應每個步驟,我這里登錄幾個步驟寫一起了,也可寫的更詳細
# 上海-悠悠,QQ交流群:750815713
# 博客地址:https://www.cnblogs.com/yoyoketang/
class LoginPage(Base):
loc_用戶名 = ("id", "id_username")
loc_密碼 = ("id", "id_password")
loc_登錄按鈕 = ("xpath", "//*[text()='登錄']")
# 判斷登錄成功
loc_后台頁面 = ("xpath", "//*[text()='后台頁面']")
@allure.step("登錄")
def login(self, username="admin", password="yoyo123456"):
'''登錄'''
self.driver.get(login_url)
self.send(self.loc_用戶名, username)
self.send(self.loc_密碼, password)
self.click(self.loc_登錄按鈕)
@allure.step("登錄結果判斷")
def is_login_success(self):
'''判斷是否登錄成功 True False'''
result = self.is_element_exist(self.loc_后台頁面)
return result
測試報告
接着查看運行結果的測試報告,展示效果如下
這樣我們只需拿着測試報告,就可以交出完美的答案了!