1. 程式人生 > 實用技巧 >Spring Boot2(014):國際化 Internationalization

Spring Boot2(014):國際化 Internationalization

專案討論

一、專案中符合自動化測試的部分有哪些?(目標和範圍 scope, 准入準出標準)

1、穩定的需求點、變動較少的頁面
2、每日構建後的測試驗證 daily build
3、比較頻繁的迴歸測試
4、需要在多平臺上執行的相同測試案例、組合遍歷型的測試、大量的重複任務
二、自動化用例在整個專案的測試用例的覆蓋率
1、一般的要求 50% +
2、重點的要求 80% +
3、根據專案的具體要求,變動特別大的專案需要額外單獨考慮覆蓋率

本文純乾貨,自備飲料,免得把自己[噎住] ( *⊙~⊙)

團隊建設

建立自動化測試的組,理想狀態下有4個人員,測試開發、中高階自動化測試工程師、2個初級自動化工程師;非理想的情況下,可能只有一個人。

測試開發:

基礎答案:自動化框架的建設,確定自動化框架的設計模式、第三方程式碼工具的封裝、中間公共模組的設計和呼叫、測試用例、測試套件的管理和執行、測試報告和測試結果的輸出(檔案輸出和郵件通知)

可選高階:如果可能的話,需要搭建持續整合伺服器(CI,Continuous Integration Server)的環境,進行持續交付和自動化的冒煙測試等。

培訓的任務,需要將設計的框架以及封裝的驅動,對其他成員進行培訓。

有自動化方案的實施經驗、有開發背景、以及持續整合的背景等。

中高階自動化測試工程師:

配合測試開發人員,實施測試框架的建設。主要負責中間公共模組的實現和例項化等,以及部分高難度和流程複雜的自動化用例指令碼編寫和除錯等工作。

有參與過自動化方案的建設、指令碼編寫經驗豐富、會程式碼除錯、懂Web測試等。

初級自動化測試工程師:

根據中間公共模組的設計,進行例項化公共模組、方法組合,實現自動化用例指令碼的編寫。
有計算機程式設計思維、有程式碼經驗、可以讀懂指令碼和HTML等。

若只有我一個人:

首先實現自動化用例的維護和執行。在這個基礎上不斷的抽取實現公共模組的設計以及測試報告的生成等工作。通過經驗的積累,以及後續人員的補充,早日做好自動化框架的建設工作。

技術方案

Selenium WebDriver、Python(unittest) Java(JUnit)、CI Server

技術方案:

選擇Python + Selenium 的技術方案。

首先技術工具是免費的,Python的工具用PyCharm社群版,Selenium的WebDriver是開源工具。利用比較簡潔的Python語言進行自動化測試,對於人員的學習成本來講比較實用,學習時間短,有優勢。

另外Python自帶的unittest單元測試框架可以很方便的實現自動化用例的設計和執行以及自動化用例套件的管理等任務。Python是純面向物件的語言,後續也可以過渡到Java + Selenium進行更加豐富的自動化測試。
此外,可以選擇Jenkins作為持續整合伺服器,配合Python+Selenium的方案進行自動化冒煙測試。

原始碼管理工具(VCS, version control system)

選擇SVN(git)作為程式碼的原始碼管理工具。整合在PyCharm中的步驟如下
1、把程式碼放到SVN在本地簽出(check out)的資料夾目錄中,例如 D:\SVN\XXProject\Trunck
2、用PyCharm開啟 剛剛部署的程式碼
3、選擇PyCharm的 VCS|Enable VCS integration,選擇 Subversion(svn) 或者 Git
4、右鍵專案檔案的根目錄,選擇 Subversion | add to VCS
5、右鍵專案檔案的根目錄,或者選 VCS | Commit Directory...
6、每天開啟程式碼後,首先 Subversion | update project

硬體:

硬體的要求不高,主要需要獨立的測試環境。另外測試人員用的電腦最好是Windows桌面作業系統,需要安裝Firefox瀏覽器,避免47.0的最新版本。測試人員最好也使用Chrome瀏覽器輔助進行Web元素的定位。

Selenium 學習總結

Selenium IDE (火狐的外掛)
1、Selenium IDE
一個基於火狐瀏覽器的外掛
2、錄製(需要確保右上角的錄製按鈕是按下去的),為了我們熟悉Selenium WebDriver/ RC
3、儲存和另存為測試用例
4、無論是否儲存用例,都可以直接回放
5、匯出測試用例的對應的程式設計指令碼
6、C# Nunit WebDriver
7、Java Junit / testNG WebDriver
8、Python unittest WebDriver
9、Ruby Test::Unit WebDriver
10、插入、編輯、刪除命令
11、學習Selenium的WebDriver/ RC

Python + Selenium WebDriver

一、搭建環境步驟

a 安裝 python3.x (windows xp 不支援 python3.5+)
b 設定環境變數 path(安裝時候也可以解決 勾上 add python.ext to path)
c 安裝Selenium 用pip命令安裝 pip install -U selenium
有無問題?
路徑,pip可能定位不到,pip也可能定位到別的資料夾(perl)
方案:cd c:\python34\scripts
外網ip問題。交換機的原因,局域網裡面是同一個ip,造成安裝超時
火狐的版本 46.0以及以下
windows 7 x64以上的系統,需要用管理員模式執行cmd,否則會安裝失敗。
普通的使用

二、定位方式

by id, name, class_name, tag_name, css_selector, xpath, link_text, partial_link_text
主要用的 是 id,name, css_selector, xpath, link_text

Selenium 基本使用

Python + Selenium 環境搭建

安裝Python,3.x(3.4 3.5 3.6)
注意:環境變數path
需要新增 "C:\Python34;C:\Python34\Scripts;"到Path
步驟:

右鍵 我的電腦 屬性 | 高階系統設定 | 環境變數
找 系統變數 | Path 並 雙擊 | Ctrl+C | 編輯 | Ctrl+V
安裝 Selenium
cmd | pip install -U selenium

-U = --upgrade 升級安裝

類似於linux命令
command -x param
容易出現的問題

1、環境變數
cd C:\Python34\Scripts
再安裝
2、管理員許可權
右鍵 管理員方式執行

WebDriver的基本使用

1、例項化一個WebDriver的物件(使用預設的火狐瀏覽器 v46或者以下)
driver = webdriver.Firefox()

注意,一定要寫括號,代表例項化物件
2、開啟網址
driver.get("")

3、查詢元素
用id : driver.find_element_by_id("account")
用name: driver.find_element_by_name("password")
用xpath css_selector

4、對元素的操作
clear()
click()
send_keys()
使用python的休眠,給瀏覽器留出時間載入頁面
sleep(2)

5、關閉退出火狐
driver.quit()

selenium WebDriver的進階操作

unittest 單元測試框架的使用

驗證:斷言 self.assertEqual(expected, actual, msg)

管理測試用例: 每一個以 test_ 開頭的方法

可以在自動化測試用例中忽略的部分:
 編號 名稱 優先順序 模組(專案) ## 忽略
必須在自動化用例中強調的部分:
    前置條件    setUp()
    輸入資料   
    步驟       test_ 開頭的方法
    預期結果   test_ 開頭的方法
    清理      tearDown()

新增的一個知識點: 測試的初始化 以及 測試的結束

setUpClass() 和 tearDownClass()

注意 上述方法 與 setUp() 和 tearDown() 的呼叫順序

1、定位方式的使用

css_selector

方法呼叫:

driver.find_element_by_css_selector("#langs > button")

CSS的3種選擇器:

1、id: 使用#+id
2、tag: 使用tag
3、class: 使用.+class

CSS selector的獲取

可以使用開發者工具,定位的元素,右鍵 | 複製 selector(複製CSS路徑)

1、Chrome使用了相對路徑 #langs > button
2、Firefox(firebug)使用了絕對路徑 html.screen-desktop-wide.device-desktop body.m-user-login div.container div#login div.panel-head div.panel-actions div#langs.dropdown.open button.btn

class_name

通過 class定位元素,必須保持 class唯一,否則定位會失敗

driver.find_element_by_class_name("btn")

link_text 和 partial_link_text

文字選擇正確就行了
xpath

chrome核心的開發者工具,複製的是相對的xpath
firefox核心的開發者工具(firebug),複製的絕對的xpath

特定的元素的處理

frame

<iframe>
 <html>
     <head></head>
      <body>
           <我們需要定位的元素>
      </body>
  </html>
</iframe>

上述程式碼中,我們需要定位的元素,處於 一個frame中:我們需要先切換到對應的frame中,然之操作,之後再退出  

# 我們需要先切換到對應的frame中
## 切換frame
driver.switch_to.frame("frame_name")
## 或者用保險的辦法切換frame
frame_element = driver.find_element_by_css_selector("#frame_id")
driver.switch_to.frame(frame_element)
## 開始做定位操作
## <----------------->
## 結束做定位操作
## 切換frame必須成對的出現。
## 退出切換的frame到預設的網頁html中
driver.switch_to.default_content()

select

select定位有個前提,元素標籤必須是 select

<select>
   
</select>
1
2
3
4
5
## 部門是個 select 元素  <select></select>
## 需要3步驟:
##    1. 找到 select 的元素,賦值給變數 dept_select
##    2. 例項化 dept_select 為 Select()的物件 為 user_adding_dept
##    3. 呼叫 user_adding_dept 的方法 select_by_index()給元素賦值

示例程式碼  

# 找到 select 的元素,賦值給變數 dept_select
dept_select = driver.find_element_by_id("dept")
  
# 例項化 dept_select 為 Select()的物件 為 user_adding_dept
user_adding_dept = Select(dept_select)
  
# 呼叫 user_adding_dept 的方法 select_by_index()給元素賦值
user_adding_dept.select_by_index(2)

清除 cookie

在開啟瀏覽器的時候,需要清理cookie。

from selenium import webdriver
  
driver = webdriver.Firefox()
driver.delete_all_cookies()
driver.get("...")

資料驅動的方式編寫用例

主要有兩種形式進行資料驅動
資料驅動:用外部資料來驅動測試用例的執行

資料庫驅動:MySQL、Oracle、PostgreSQL、SQL Server

import pymysql
  
connect = pymysql.connect(host="xx", port=3306, user="root", passwd="xxx", db="xx")
cur = connect.cursor()
cur.execute("SELECT...")
mysql_data = cur.fetchall()
for row in mysql_data:
    # 進行測試
    # 使用字典型別
    data_to_test = {
      "key1": row[0],
      "key2": row[1]
    }
     
cur.close()
connect.close()

資料檔案驅動:csv檔案最典型、xml檔案、txt檔案

import csv
  
csv_file = open("xxx.csv", "r", encoding="utf8")
csv_data = csv.reader(csv_file)
for row in csv_data:
    # 進行測試
    # 使用字典型別
    data_to_test = {
      "key1": row[0],
      "key2": row[1]
    }
  
csv_file.close()

需要掌握的知識點:

1、python的字典型別 dict 型別
2、python的讀寫檔案
3、python的讀寫資料庫
4、for迴圈
5、注意資源的釋放
關閉資料庫遊標和連線
關閉檔案

模組化的方式編寫用例

需要將每個用例都需要用的公共的功能,抽取出來,放到一個公共類中,作為模組化

建立一個Python Package "common",在裡面建立一個ranzhi_common.py檔案,裡面新增RanzhiCommon類

1、login() : 普通登入,預設用admin/123456登入
2、logout():退出系統
3、login_by_dict(user_to_login):使用字典型別的引數進行登入,user_to_login 是一個字典型別 dict
4、change_language(lang):zh_CN, en_US, zh_TW 切換語言,需要引數傳遞要切換的語言
5、select_app(app):crm, admin, oa, cash, team 選擇App,需要傳遞選擇 後臺管理 | 客戶管理 。。。
6、select_menu_for_admin(menu): organization 選擇了後臺管理以後,選擇選單 組織
7、add_user(user_to_add): 使用字典型別的引數進行新增

建立測試用例的類,比如 ranzhi_test_01.py ranzhi_test_02.py ranzhi_test_03.py... 在這些類中呼叫上面建立的類,一般會放到setUp() 中

import unittest
from common.ranzhi_common import RanzhiCommon
  
class RanzhiTest01(unittest.TestCase):
     
    def setUp(self):
        ranzhi_common = RanzhiCommon()
         
    def test_xxx(self):
        ranzhi_common.login()
        ##...

Selenium 自動化測試方案

基礎方案

1、使用unittest,主要是用 TestCase(測試用例)
2、使用模組化(基本的模組化,抽取公共模組)
3、使用資料驅動的方式(主要包括 資料庫的形式 和檔案讀取 )
4、定製執行需要測試的用例,使用unittest,主要用的是TestSuite(測試套件)、和 5、TextTestRunner(文字測試執行器)[或者HTMLTestRunner]
6、生成測試報告(傳送報告到指定郵箱)

方案實現的具體步驟:

1、使用PyCharm建立新的PurePython專案

2、在專案中建立如下的資料夾(python package)

TestCase
Data
Common
TestRunner
Report
3、分別實現上述模組

在Data中存放資料,CSV檔案,或者也可以放到資料中,使用資料驅動

## 使用csv檔案
csv.reader()
## 使用資料庫(MySQL),可以參考www.imooc.com的python操作MySQL的視訊
cur.fetchall()

在Common中,建立測試公共模組,實現模組化的操作  

## __init__(self, driver: webdriver.Firefox, base_url)
self.common = RanzhiCommon(self.driver, self.base_url)

在TestCase建立自動化測試用例,注意使用unittest.TestCase 

def setUp()
def tearDown()
det test_xxx()

在TestRunner建立測試執行器和測試套件,使用unittest.TestSuite和HTMLTestRunner(第三方) 

test_suite = unittest.TestSuite()
test_suite.addTest(RanzhiLogonTc01("test_xxx"))
  
html_test_runner = HTMLTestRunner(stream=report_file, title="xxx", description="dddd")
html_test_runner.run(test_suite)

專案根目錄建立main.py,作為測試專案的主入口,執行測試。

檢查測試報告

Selenium 可能遇到的問題

有無問題?

a <iframe>
    f1 = find_element_by_css_selector(frame)
    switch_to.frame(f1) 
b <select>
    s1 = find_element_by_css_selector(select)
    ss1 = Select(s1)
    ss1.select_by_index(0)
    ss1.select_by_value("人事部")
c 編碼問題 utf-8
d 時間等待問題 sleep(5)

單元測試框架

unittest

解決了什麼問題?

unittest.TestCase
    前置條件
    清理
    測試過程步驟
    斷言 assertEqual(期望值, 實際結果, 錯誤提示)
    執行測試 test_開頭的方法
unittest.TestSuite
    addTest(xxx("test_batch_login"))
    自定義的新增測試用例,並執行
unittest.TextTestRunner
    run(suite)
    執行建立並維護好的測試套件
     
test_runner  test_suite  test_case
測試執行器    測試套件     測試用例

模組化操作

面向物件的實踐:
1. 編寫一個類,類裡面描述公共的方法
2. 例項化這個類,呼叫這個類的方法
有無問題?
類的構造方法,需要傳遞 webdriver.Firefox()
    self.common = RanzhiCommon(self.browser, self.base_url)

資料驅動測試

讀取csv,迴圈每一行資料進行操作

讀取MySQL,用例存到MySQL中 

1. 中文編碼的問題。
    # coding="utf-8"
    讀csv的時候,新增 encoding='utf-8'
    csv.reader(open("xxx.csv", "r", -1, encoding="utf-8")
2. 迴圈放到最外層
3. 檔案路徑在控制檯讀取不到的問題,需要用絕對路徑來指向檔案

封裝WebDriver

1、避免第三方程式碼的威脅,防止大批量修改測試用例
2、節約人力的成本(如果封裝以後,不需要每個自動化測試工程師都會WebDriver)
3、標準化自動化用例的操作,只需要呼叫公共的標準模組就好。

以上是我給大家整理的一個關於自動化的web ui的一個專案從開始到完成的方案