TPshop項目測試流程
- 先手點,過一遍基本的流程,大體的操作這個要測試的功能
- 寫測試用例。(盡可能考慮各種可能性)
- 對著測試用例,進行功能測試。
- 考慮自動化。
項目準備
準備之前用到的base和配置文件等
先寫一個正確的測試腳本
進入登錄界面
- 創建兩個文件在對應的文件夾下,login_page、test_login
- 在test_login下,setup中,連接手機(導入模塊,使用init_driver函數)
- 在login_page下,寫類,繼承BaseAction
- 在test_login下,創建page對象
- 分析步驟,發現部分步驟是必須要有的。考慮寫在page的init中
- 因為在login中,發現一定是有需要前置的步驟,在page的類里,重寫init的函數,并且在調用父類init之后,執行“必要的步驟”com.tpshop.malls:id/tab_txtv
登錄測試腳本
- 輸入手機號,輸入密碼,點擊登錄。在page中實現,并且在test調用
- 在page中寫is_login的函數。找手機號,如果找到,返回true如果沒找到,會報錯,在except中返回false
- 在test中斷言 is_login 的結果
獲取toast
下載 appium-uiautomator2-driver
cnpm install appium-uiautomator2-driver
前置代碼添加
desired_caps['automationName'] = 'Uiautomator2'
使用driverWait的方式尋找
def find_toast(driver, message, timeout=3):
"""
# message: 預期要獲取的toast的部分消息
"""
message = "http://*[contains(@text,'" + message + "')]" # 使用包含的方式定位
element = WebDriverWait(driver, timeout, 0.1).until(lambda x: x.find_element(By.XPATH, message))
return element.text
注意:某些函數的寫法Uiautomator1與Uiautomator2的不一樣
driver.press_keycode(4) # 點擊返回,Uiautomator2的寫法
driver.keyevent(4) # 點擊返回,Uiautomator1的寫法
改進
改進1:將登錄成功失敗改為toast
- 在base中,寫了一個find_toast的函數,返回,根據部分內容,找到的全部內容。
- 在base中,寫了一個is_toast_exist的函數,如果找到,則返回true,如果找不到,則報錯并且返回false
- desired_caps['automationName'] = 'Uiautomator2'!!!!!!!
- 切記!
- 切記!
- 切記!
以后,如果需要獲取toast的全部內容,使用find_toast。
如果需要獲取toast的部分內容是否存在,使用is_toast_exist。
改進2:數據參數化進階
data.yml文件數據格式改成:
test_login:
test_login_001:
username: "章三"
password: "zhangsan"
test_login_002:
username: "李四"
password: "lisi"
test_sign_up:
test_sign_up_001:
username: "王五"
password: "wangwu"
number: "185030303030"
test_sign_up_002:
username: "周六"
password: "zhouliu"
number: "13788888888"
base_yml.py 里面解析yaml文件的函數改成:
import yaml
def yaml_data_with_file(file_name, key):
with open("./data/" + file_name + ".yml", "r") as f:
data = yaml.load(f)[key]
case_data_list = list()
for case_data in data.values():
case_data_list.append(case_data)
return case_data_list
對應的test_login.py 就改成:
import pytest, os, sys
sys.path.append(os.getcwd())
from base.base_yml import yaml_data_with_file
def data_with_key(key):
return yaml_data_with_file("login_data", key)
class TestLogin:
@pytest.mark.parametrize("args", data_with_key("test_login"))
def test_login(self, args):
print("測試登錄 2 個數據")
print(args["username"])
print(args["password"])
@pytest.mark.parametrize("args", data_with_key("test_sign_up"))
def test_sign_up(self, args):
print("測試注冊 3 個數據")
print(args["username"])
print(args["password"])
print(args["number"])
項目管理知識:
截圖
應該在重要的時候,進行截圖,并且上傳到報告中。(比如,在測試搜索功能。那么搜索的結果,就算是重點)
截圖使用,get_screenshot_as_file("路徑"),需要在項目中,專門建立一個文件夾。名字叫做screen。來保存截圖
上傳截圖到allure
allure.attach('描述', open('xx.png', 'rb').read(), allure.attach_type.PNG)
類似于allure的文字描述。第一個參數是描述,第二個參數是描述的內容,第三個參數是類型。
關于git的忽略文件
在上傳git項目的時候,有些不需要上傳的文件,比如,python的緩存以及編譯文件。包括report的報告。還有pycharm的.idea等。如果不想上傳,需要做一個忽略文件的操作。
忽略文件的名字,叫做.gitignore。具體規則,可以百度。一般把,github自帶的python的忽略文件,再加上report和.idea就可以了。
剩下的操作都一樣,這個忽略文件要放在項目目錄下。(和.git同目錄)
配置jenkins
- 運行服務
- 項目,git的地址,賬號密碼,時間觸發器,pytest的環境,allure報告的文件夾名稱(xml的所在的文件夾名字)。這樣可以生成報告,會自動檢測git代碼的更變。
- 發件人和收件人。
- 發件人需要先測試,搜索location 配置管理員郵箱,搜索“郵件通知”配置smtp以及用戶名和密碼。點擊測試發信。
- 發件人正經的配置,搜索,content,需要配置選擇html的模板,以及模板的內容,在上面一點,有一個英文的 email notifacation。配置smtp以及用戶名和密碼。
app開發一些常識
關于toast。toast是只在android中有。不是所有的兩分(秒)鐘消失的那個視圖都叫做toast。
-
android常見控件及其開發中的所屬類名:
按鈕:Button
文本框,顯示文字:TextView
輸入框,用來輸入:EditText
-
ios常見控件及其開發中的所屬類名:
按鈕:UIButton
文本框,顯示文字:UILabel
輸入框,用來輸入:UITextFiled
在iOS中也有一個叫做UITextView的東西,是用來輸入大段文本的
在iOS類名中有前綴,涉及到視圖都是UI開頭。
命名空間:Android中有命名空間這個概念,所以在不同的文件夾中起相同名字的文件是可以區分的;但是在iOS中沒有這個概念,所以在不同文件夾中起相同的名氣是不行的。iOS開發中也有一個常用框架(AFNetworking),是用objective-c開發的文件,類的后綴名是.h和.m
不想appium重置應用
在base driver那里加一句:
desired_caps['noReset'] = True
bug
關于xpath的and問題。
字符串多個條件用and連接,如果and后面直接是@那么可以不要空格。如果是其他的字符,需要加空格