接口第一章:
接口業(yè)務(wù)方向
? 接口規(guī)范:http://open.weibo.com/wiki/2/comments/by_me
? 接口管理平臺(tái)工具:
? http://yapi.demo.qunar.com/
? https://www.eolinker.com/
接口測(cè)試框架選擇
業(yè)務(wù):postman jmeter
業(yè)務(wù)自動(dòng)化:python robotframwork(備注:只支持python 2.8 3以上不支持)? Python 基于requests(搭建一套數(shù)據(jù)分離框架)
? ? ? ? ? ? java httpclient? java+maven+testng+rest-assured搭建的一套自動(dòng)化框架
charles安裝配置:
? https://blog.csdn.net/longxingzhiwen/article/details/70313773
? 1.設(shè)置端口號(hào)
? 2.安裝證書(shū) chls.pro/ssl? charlesproxy.com/getssl
抓接口亂碼處理
? https://www.cnblogs.com/itcqx/p/6529439.html
? http://www.paincker.com/charles-charset-incorrect
接口寫(xiě)用例:
? 查詢選車(chē)列表:https://selectcar.yiche.com/selectcarforapp?mid=7&s=4&page=1&pagesize=20&cityId=201
? ? ? ? ? ? ? mid是品牌6 7 8 9
? page多少頁(yè)
? pagesize這一頁(yè)顯示多少條
charles抓包步驟:
第一步:? cmd-ipconfig找到IP,手機(jī)設(shè)置IP和端口8888
第二步:手機(jī)打開(kāi)瀏覽器瀏覽器裝入裝入證書(shū)手機(jī)瀏覽器裝證書(shū)兩種方式chls.pro/ssl? charlesproxy.com/getssl(注意事項(xiàng):1.如果你的手機(jī)自動(dòng)瀏覽器裝不上證書(shū)投储,可以下載一個(gè)chrome瀏覽器去安裝信任(iOS-通用-信任) 2.如果裝后抓不到一定要關(guān)閉防火墻)
第三步:charles help->ssl proxying->install下一步下一步安裝
Python自動(dòng)化方向:
? 了解熟悉requests: https://2.python-requests.org//zh_CN/latest/user/quickstart.html
? 安裝方法:http://www.lfd.uci.edu/~gohlke/pythonlibs? pip install requests
? 公共接口地址:https://blog.csdn.net/c__chao/article/details/78573737
python接口第二章:
1.字典轉(zhuǎn)化JSON(json.dumps()? json轉(zhuǎn)化為字典(json.loads())
2.unittest官方文檔
https://docs.python.org/2/library/unittest.html
漢化精簡(jiǎn)版:
http://www.testertechnology.com/posts/detail?id=661
第一個(gè)知識(shí)點(diǎn):
#classmethod 修飾符對(duì)應(yīng)的函數(shù)不需要實(shí)例化,不需要 self 參數(shù),但第一個(gè)參數(shù)需要是表示自身類(lèi)的 cls 參數(shù)
classmethod.py 中
#@classmethod #方法調(diào)用不用去實(shí)例化
#① setup(): 每個(gè)測(cè)試函數(shù)運(yùn)行前運(yùn)行
#② teardown(): 每個(gè)測(cè)試函數(shù)運(yùn)行完后執(zhí)行
#③ setUpClass(): 必須使用 @ classmethod裝飾器, 所有test運(yùn)行前運(yùn)行一次
#④ tearDownClass(): 必須使用 @ classmethod裝飾器, 所有test運(yùn)行完后運(yùn)行一次
第二個(gè)知識(shí)點(diǎn):
parameterized參數(shù)化: 安裝 https://pypi.org/project/parameterized/
****************************************************
安裝:pip install parameterized
導(dǎo)入:from parameterized import parameterized
*****parameterized參數(shù)化運(yùn)行的方式步清,必須是普通方式運(yùn)行灰追,如果用unittest方式運(yùn)行會(huì)報(bào)錯(cuò)
安裝包的方式:
1.cmd中-pip install? parameterized
2.第二種安裝方式:pycharm類(lèi)中先引入對(duì)應(yīng)的包名進(jìn)入default settings中->添加輸入包名安裝如果按照過(guò)程中失敗布近,那么使用下面方法
Pycharm安裝package出現(xiàn)報(bào)錯(cuò):module 'pip' has no attribute 'main'解決方案如下:
https://www.cnblogs.com/Fordestiny/p/8901100.html
如果你們?cè)趐ycharm中project interpreter中下載包提示erro一直下載失敗执虹,那么久需要進(jìn)入 helpers/packaging_tool.py文件找到do_install修改如下代碼:
def do_install(pkgs):
try:
# import pip
try:
from pip._internal import main
except Exception:
from pip import main
except ImportError:
error_no_pip()
return main(['install'] + pkgs)
def do_uninstall(pkgs):
try:
# import pip
try:
from pip._internal import main
except Exception:
from pip import main
except ImportError:
error_no_pip()
return main(['uninstall', '-y'] + pkgs)
**********************************************************************************
安裝:pip install parameterized
導(dǎo)入:from parameterized import parameterized
使用方法:parmeterdemo1.py
如果運(yùn)行控制臺(tái)出現(xiàn)此類(lèi)錯(cuò)誤羡滑,TypeError: don't know how to make test from: None 說(shuō)明運(yùn)行方法不能使用unittest方式運(yùn)行
要使用普通方法運(yùn)行
3. pycharm類(lèi)中先引入對(duì)應(yīng)的包名,頁(yè)面左上角有個(gè)小燈泡圖標(biāo)安裝選擇install xxx包名
第三個(gè)知識(shí)點(diǎn):
unittest斷言歸納:http://www.testertechnology.com/posts/detail?id=663 tclogin6
代碼注釋:#ctrl+/ 注釋和取消注釋
第四個(gè)知識(shí)點(diǎn):
logging使用說(shuō)明:
logging有什么作用:主要打印一些日志信息或者出錯(cuò)信息菇爪,方便排查問(wèn)題(同學(xué)們只需要掌握,會(huì)使用柒昏,不需要會(huì)寫(xiě)笙什,這個(gè)其實(shí)就是公共的方法)
logging.basicConfig(level=logging.DEBUG, format=LOG_FORMAT, datefmt=DATE_FORMAT)--控制臺(tái)打印日志(basicConfig)方法
http://www.testertechnology.com/posts/detail?id=664
官網(wǎng):https://docs.python.org/3/library/logging.html https://www.cnblogs.com/liujiacai/p/7804848.html
http://www.testertechnology.com/user/home?id=87
*********************************************************************
第四章 python 參數(shù)化結(jié)合怎么讀取excel數(shù)據(jù)
xlrd模塊:
Python的三方庫(kù)xlrd用于對(duì)excel文件進(jìn)行讀取嗽元,可以是“.xls”或“.xlsx”格式(舊版本可能不支持“.xlsx”)。
下載安裝:https://pypi.org/project/xlrd/#files,或者使用pip安裝 “pip install xlrd”
API文檔:https://xlrd.readthedocs.io/en/latest/api.html
xlrd常用的方法:
work_book = xlrd.open_workbook(filename):打開(kāi)指定路徑的excel文件腕扶,返回excel處理對(duì)象竿屹,但無(wú)法打開(kāi)不存在的文件骆撇。
work_book.nsheets:返回excel中的sheet個(gè)數(shù)醉箕。
work_book.sheets():加載并返回excel中的所有sheet對(duì)象組成的列表。
work_book.sheet_by_index(sheetx):返回對(duì)應(yīng)索引的sheet對(duì)象泥耀,索引范圍為range(work_book.nsheets)饺汹。
work_book.sheet_by_name(sheet_name):返回對(duì)應(yīng)sheet名稱的sheet對(duì)象。
work_book.sheet_names():返回excel中所有sheet名稱組成的列表痰催。
sheet.book:sheet所屬的work_book兜辞。
sheet.name:sheet的名稱迎瞧。
sheet.nrows:sheet中的行數(shù)。
sheet.ncols:sheet中的列數(shù)弦疮。
sheet.row(rowx):返回對(duì)應(yīng)行的cell對(duì)象組成的列表夹攒。
sheet.row_slice(rowx, start_colx=0, end_colx=None):返回對(duì)應(yīng)行的cell對(duì)象組成的列表,也自定義切片獲取行的cell對(duì)象列表胁塞。
sheet.col(colx):返回對(duì)應(yīng)列的cell對(duì)象組成的列表。
sheet.col_slice(colx, start_rowx=0, end_rowx=None):返回對(duì)應(yīng)列的cell對(duì)象組成的列表压语,也自定義切片獲取行的cell對(duì)象列表啸罢。
sheet.cell(rowx, colx):返回對(duì)應(yīng)單元格的cell對(duì)象。
sheet.cell_value(rowx, colx):返回對(duì)應(yīng)單元格的值胎食。
sheet.row_len(rowx):返回對(duì)應(yīng)行的有效單元格數(shù)扰才。
sheet.get_rows():返回一個(gè)行的迭代器,每次迭代返回一個(gè)cell對(duì)象組成的列表厕怜,即這一行的cell對(duì)象列表衩匣。
sheet.row_values(rowx, start_colx=0, end_colx=None):返回對(duì)應(yīng)行的值的列表,也可以自定義切片獲取某些值粥航。
sheet.col_values(colx, start_rowx=0, end_rowx=None):返回對(duì)應(yīng)列的值的列表琅捏,也可以自定義切片獲取某些值。
sheet.cell(rowx, colx).value:返回對(duì)應(yīng)單元格的值文檔递雀。
接口第四章:xml和config.ini配置讀取
作用:1.xml提高接口靈活度參數(shù)可隨時(shí)配置(xml組裝:www.baidu.com/backend/student/unauth/login)?
? ? ? 2.config切換線上線下環(huán)境方便
xml:
#Python有三種方法解析XML柄延,SAX,DOM缀程,以及ElementTree
sax:解析器主要解析xml
dom對(duì)象結(jié)構(gòu):
#登錄接口
? ? <url name="studentLogin">
? ? ? ? <group>student</group>
? ? ? ? <module>unauth</module>
? ? ? ? <action>login</action>
? ? </url>
#ElementTree 例如:url下面->group->module->action 節(jié)點(diǎn)? 統(tǒng)稱為elementtree節(jié)點(diǎn)
#as? 修飾定義別名
xml:節(jié)點(diǎn)可以隨意去配置,主要滿足你的業(yè)務(wù)需求即可
xml必須導(dǎo)入該方法:from xml.etree import ElementTree as ElementTree
# 解析xml文檔
? ? tree = ElementTree.parse(url_path)
# Element.iter(tag=None):遍歷該Element所有后代搜吧,也可以指定tag進(jìn)行遍歷尋找。
# Element.findall(path):查找當(dāng)前元素下url或path能夠匹配的直系節(jié)點(diǎn)杨凑。
# Element.find(path):查找當(dāng)前元素下tag或path能夠匹配的首個(gè)直系節(jié)點(diǎn)滤奈。
# Element.text: 獲取當(dāng)前元素的text值。
# Element.get(key, default=None):獲取元素指定key對(duì)應(yīng)的屬性值撩满,如果沒(méi)有該屬性蜒程,則返回default值
config.ini 配置
1.創(chuàng)建一個(gè)config配置文件,格式如下:
[HTTP]
scheme = http
baseurl =http://xingmengwuhen.test.com
port = 8080
timeout = 10
2.封裝一個(gè)讀取配置文件的公共方法
import configparser
#1.獲取配置文件路徑
? proDir = os.path.split(os.path.realpath(__file__))[0]
? configPath = os.path.join(proDir, "config.ini")
#2.打開(kāi)config.ini讀取配置read()
? fd = open(configPath)
? data = fd.read()
#3.生成conf對(duì)象
? self.cf = configparser.ConfigParser();
#4.載入配置文件
self.cf.read(configPath)
#5.獲取對(duì)應(yīng)配置信息
def get_http(self, name):
self.cf.get 獲取 [HTTP]鹦牛,‘name’
#6.from? config import? readconfig
#調(diào)用方法
readcon=readconfig.Read()
7.讀取
host=readcon.get_http("port")
baseurl=readcon.get_http("baseurl")
詳細(xì)信息:http://zixuephp.net/article-431.html
綜合練習(xí):
xml+config+json格式接口請(qǐng)求
接口:
config:http://api-shuangshi.tengyue360.com+xml:/backend/student/unauth/login
http://api-shuangshi.tengyue360.com/backend/student/unauth/login
json格式請(qǐng)求:
{
"phone": "14050000000",
"password": "e10adc3949ba59abbe56e057f20f883e",
"messageCode": "",
"loginType": 1,
? ? "timestamp": ""
}
**************
節(jié)點(diǎn)獲雀愀狻:
例如:
{
'errno': 200,
'error': '操作成功',
'data': {
'id': '1027',
'name': '測(cè)試'
},
'token': None
}
aa=res.json();
print(aa['error'])
print(aa['data']['id'])
**
https://selectcar.yiche.com/selectcarforapp?mid=7&s=4&page=1&pagesize=20&cityId=201
{
? ? "status": 1,
? ? "message": "ok",
? ? "data": {
? ? ? ? "count": 26,
? ? ? ? "carNumber": 236,
? ? ? ? "resList": [
? ? ? ? ? ? {
? ? ? ? ? ? ? ? "masterId": 7,
? ? ? ? ? ? ? ? "serialID": 1879,
? ? ? ? ? ? ? ? "name": "卡羅拉",
? ? ? ? ? ? ? ? "allSpell": "kaluola",
節(jié)點(diǎn)獲取:
cc=res.json();(備注:JSON.data.resList[0].name)
print(cc['data']['resList'][0]['name'])
第五章:Python自動(dòng)化框架搭建
好處:1.采用數(shù)據(jù)分離,目錄結(jié)構(gòu)分層后期好維護(hù)
? ? ? 2.線上線下環(huán)境隨意切換靈活
? 3.可以實(shí)現(xiàn)多接口使用EXCEL操作
? 4.持續(xù)集成比較清晰曼追,簡(jiǎn)單
? 5.可以持續(xù)集成方便報(bào)告查看
目錄 結(jié)構(gòu):
common:存放一些公共通用的方法
result:執(zhí)行過(guò)程中生成的文件夾窍仰,里面存放每次測(cè)試的結(jié)果
testCase:用于存放具體的測(cè)試case
testFile:存放測(cè)試過(guò)程中用到的文件,包括上傳的文件礼殊,測(cè)試用例
caselist:txt文件驹吮,配置每次執(zhí)行的case名稱
config:配置一些常量针史,例如數(shù)據(jù)庫(kù)的相關(guān)信息,接口的相關(guān)信息參數(shù)等
readConfig: 用于讀取config配置文件中的內(nèi)容
runAll:用于執(zhí)行case
_init_.py 區(qū)分文件夾導(dǎo)入的包
token 是什么碟狞?是一個(gè)令牌啄枕,一種身份的驗(yàn)證
############ hTMLTETRUNNER報(bào)告結(jié)果,加載之后就讓顯示接口部信息在
? <script>
? window.onload=function(){
? ? ? showCase(2)
? ? }
</script>