軟件測試會用到正則表達式嗎?答案是肯定的:
正則表達式的應用場景有很多,一般是用來驗證字符串,提取字符串和替換字符串。
在接口測試或性能測試中,經常需要從響應結果中提取數據作。經常用提取方法方式包括XPath和正則表達式提取法(例如:Jmeter中的正則表達式提取器)。
XPath的應用在前邊UI自動化中已經介紹,今天主要學習下正則表達式的應用。
一、概念
正則表達式是對字符串(包括普通字符(例如,a 到 z 之間的字母,0-9之間的數字)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
正則表達式是一種文本模式,該模式描述在搜索文本時要匹配的一個或多個字符串。
比如:
表達式“ab+” 可以匹配 'ab', 'abb','abbbbb'等,+號代表前面的字符必須出現一次活多次。
表達式“ab*c”可以匹配‘ac’、‘abc’、‘abbbbc’等,*號代表前邊的字符可以不出現,也可以出現一次或多次。
表達式“ab?c”可以匹配‘ac’、‘abc’,?代表前面的字符最多出現一次,也可能是零次。
二、語法
1、普通字符
普通字符包括沒有顯式指定為元字符的所有可打印和不可打印字符
所有大寫和小寫字母、所有數字、所有標點符號和一些其他符號都屬於普通字符的范疇。
2、非打印字符
換行(\n)、回車(\r)等都屬於非打印字字符。正則表達式前均會加‘\’來表示。
3、特殊字符
一些有特殊含義的字符,比如*、\、$、()、^、|等。
4、限定符
用來指定正則表達式的一個給定組件必須要出現多少次才能滿足匹配。
有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6種。
*、+、{n}、{n,}、{n,m}配合?使用,可以實現最少匹配*?表示重復0次或多次,但盡可能少的重復,以此類推。
5、定位符
定位符用來描述字符串或單詞的邊界,用於正則表達式固定到行首或行尾。
^ 和 $ 分別指字符串的開始與結束,\b 描述單詞的前或后邊界,\B 表示非單詞邊界。
常用元字符對照說明表,基本滿足日常應用:
注意:如果要匹配*、\、+、?等特殊符號本身,必須要使用字符"轉義",即,將反斜杠字符\ 放在它們前面 。
比如:獲取*用表達式\*,獲取+用表達式\+。
6、貪婪與非貪婪
當正則表達式中包含限定符時,都是盡可能多的字符,這中匹配方式叫做貪婪匹配。
為了避免重復多次的匹配,實現最小匹配,引入非貪婪,通常在限定符后邊加?實現。
{
code123
}
貪婪寫法:code(\d+)
匹配結果:123
非貪婪寫法:code(\d+?)
匹配結果:1
三、運算符優先級
從左到右進行計算,並遵循優先級順序;相同優先級的從左到右進行運算,不同優先級的運算先高后低。
四、示例
結合Jmeter正則表達式,我們來看下正則表達式的應用。
1、正則表達式提取器
Apply to:應用范圍。
要檢查的響應字段:樣本數據源。
引用名稱:引用時的變量名稱,使用時輸入${name}替換參數即可。
正則表達式:用於匹配數據,()括號里面的內容為真實需要的值。
模板:用於從找到的匹配項創建字符串的模板。這是一個帶有特殊元素的任意字符串,用於引用正則表達式中的組。
引用組的語法是:'$1$'引用組1,'$2$ '引用組2。$0$引用整個表達式匹配的內容。
通過正則表達式測試器,更直觀的感受一下$1$,$0$對應的值是什么。
匹配數字:正則表達式匹配數據的所有結果可以看做一個數組,匹配數字即可看做是數組的第幾個元素。
-1表示全部,0隨機,1第一個,2第二個,以此類推。若只要獲取到匹配的第一個值,則填寫1
缺省值:匹配失敗時的默認值,可以指定一個默認值,或不指定均可以。
2、正則表達式練習
示例1:獲取code值,用於其它接口的入參
{ "code": "205520", "name": "test-20-header" }
正則表達式1:code":\s"([0-9]+)
正則表達式2:code":\s"(\d+)
說明:要取的值在括號里面,使用\s是不確定中間是否有空格等特殊符號,后邊用+是防止有多個空格,[0-9]+等價於\d
示例2:獲取code值,用於其它接口的入參
{
"code": "520",
"name": "test-520",
"code": "521"
}
獲取第1個code的正則表達式:"code":\s"(\d+)",\s+"name
獲取第2個code的正則表達式:name":\s+\S+\s+"code":\s"(\d+)
說明:當一個返回體中,同一個元素具有多個時,如何取值呢?
我們看看兩個code有什么特征:
第1個code下面接着是name參數,可以根據name向上找code
第2個code上面是name參數,可以根據name向下找code
示例3:獲取第1個code值,用於其它接口的入參
{
"id": "22ui45abc3i3902334",
"code": "520",
"name": "test-520",
"code": "521",
"name": "test-521"
}
正則表達式:id":\s+"\S+\s+"code":\s"(\d+)
說明:code沒有第2個實例的特征了,但是發現第一個code的前邊是id參數,可以根據id找第一個code值