據(jù)科學家比軟件工程師擅長統(tǒng)計,又比統(tǒng)計學家擅長軟件工程。聽起來牛逼轟轟,事實卻是,許多數(shù)據(jù)科學家有統(tǒng)計學背景,卻沒有什么軟件工程方面的經(jīng)驗,因此在編碼時容易犯一些簡單的錯誤。作為一名高級數(shù)據(jù)科學家,本文作者總結了他在工作中常見數(shù)據(jù)科學家犯的十大錯誤。
我是一名高級數(shù)據(jù)科學家,在 Stackoverflow 的 python 編碼中排前 1%,而且還與眾多(初級)數(shù)據(jù)科學家一起工作。下文列出了我常見到的 10 個錯誤。
沒有共享代碼中引用的數(shù)據(jù)
數(shù)據(jù)科學需要代碼和數(shù)據(jù)。所以為了讓其他人能夠復現(xiàn)自己做出來的結果,你需要提供代碼中涉及的數(shù)據(jù)。這看起來很簡單,但許多人會忘記共享代碼中需要的數(shù)據(jù)。
import pandas as pd df1=pd.read_csv('file-i-dont-have.csv') # fails do_stuff(df)
解決方案:用 d6tpipe 共享代碼中的數(shù)據(jù)文件,或者將數(shù)據(jù)文件上傳到 S3/網(wǎng)頁/Google 云等,還可以將數(shù)據(jù)文件保存到數(shù)據(jù)庫中,以便收件人檢索文件(但不要將數(shù)據(jù)添加到 git 中,這一點后面的內容會講到)。
硬編碼其他人無法訪問的路徑
和錯誤 1 類似,如果硬編碼其他人無法訪問的路徑,他們就沒法運行你的代碼,而且在很多地方都必須要手動修改路徑。Booo!
import pandas as pd df=pd.read_csv('/path/i-dont/have/data.csv') # fails do_stuff(df) # or impor os os.chdir('c:\\Users\\yourname\\desktop\\python') # fails
解決方案:使用相對路徑、全局路徑配置變量或 d6tpipe,這樣其他人就可以輕易訪問你的數(shù)據(jù)了。
將數(shù)據(jù)和代碼混在一起
既然數(shù)據(jù)科學代碼需要數(shù)據(jù),為什么不將代碼和數(shù)據(jù)存儲在同一個目錄中呢?但你運行代碼時,這個目錄中還會存儲圖像、報告以及其他垃圾文件。亂成一團!
├── data.csv ├── ingest.py ├── other-data.csv ├── output.png ├── report.html └── run.py
解決方案:對目錄進行分類,比如數(shù)據(jù)、報告、代碼等。參閱 Cookiecutter Data Science 或 d6tflow 項目模板,并用問題 1 中提到的工具存儲以及共享數(shù)據(jù)。
用 Git 提交數(shù)據(jù)
大多數(shù)人現(xiàn)在都會版本控制他們的代碼(如果你沒有這么做那就是另一個問題了!)。在共享數(shù)據(jù)時,可能很容易將數(shù)據(jù)文件添加到版本控制中。對一些小文件來說這沒什么問題。但 git 無法優(yōu)化數(shù)據(jù),尤其是對大型文件而言。
git add data.csv
解決方案:使用問題 1 中提到的工具來存儲和共享數(shù)據(jù)。如果你真的需要對數(shù)據(jù)進行版本控制,請參閱 d6tpipe、DVC 和 Git Large File Storage。
寫函數(shù)而不是 DAG
數(shù)據(jù)已經(jīng)討論得夠多了,接下來我們談談實際的代碼。你在學編程時,首先學的就是函數(shù),數(shù)據(jù)科學代碼主要由一系列線性運行的函數(shù)組成。這會引發(fā)一些問題,詳情請參閱「4 Reasons Why Your Machine Learning Code is Probably Bad。」
def process_data(data, parameter): data=do_stuff(data) data.to_pickle('data.pkl') data=pd.read_csv('data.csv') process_data(data) df_train=pd.read_pickle(df_train) model=sklearn.svm.SVC() model.fit(df_train.iloc[:,:-1], df_train['y'])
解決方案:與其用線性鏈接函數(shù),不如寫一組有依賴關系的任務??梢杂?d6tflow 或者 airflow。
寫 for 循環(huán)
和函數(shù)一樣,for 循環(huán)也是你在學代碼時最先學的。這種語句易于理解,但運行很慢且過于冗長,這種情況通常表示你不知道用什么替代向量化。
x=range(10) avg=sum(x)/len(x); std=math.sqrt(sum((i-avg)**2 for i in x)/len(x)); zscore=[(i-avg)/std for x] # should be: scipy.stats.zscore(x) # or groupavg=[] for i in df['g'].unique(): dfg=df[df[g']==i] groupavg.append(dfg['g'].mean()) # should be: df.groupby('g').mean()
解決方案:NumPy、SciPy 和 pandas 都有向量化函數(shù),它們可以處理大部分你覺得需要用 for 循環(huán)解決的問題。
沒有寫單元測試
隨著數(shù)據(jù)、參數(shù)或者用戶輸入的改變,你的代碼可能會中斷,而你有時候可能沒注意到這一點。這就會導致錯誤的輸出,如果有人根據(jù)你的輸出做決策的話,那么錯誤的數(shù)據(jù)就會導致錯誤的決策!
解決方案:用 assert 語句檢查數(shù)據(jù)質量。Pandas 也有相同的測試,d6tstack 可以檢查數(shù)據(jù)的獲取,d6tjoin 可以檢查數(shù)據(jù)的連接。檢查數(shù)據(jù)的示例代碼如下:
assert df['id'].unique().shape[0]==len(ids) # have data for all ids? assert df.isna().sum()<0.9 # catch missing values assert df.groupby(['g','date']).size().max()==1 # no duplicate values/date? assert d6tjoin.utils.PreJoin([df1,df2],['id','date']).is_all_matched() # all ids matched?
沒有注釋代碼
我明白你急著做分析。于是你把代碼拼湊起來得到結果,把結果交給你的客戶或者老板。一周之后他們找到你,問你「你能改掉 xyz 嗎?」或「你能更新一下結果嗎?」。然后你和自己的代碼大眼瞪小眼,既不記得你為什么要這么做,也不記得你做過什么。現(xiàn)在想象一下其他人運行這段代碼時的心情。
def some_complicated_function(data): data=data[data['column']!='wrong'] data=data.groupby('date').apply(lambda x: complicated_stuff(x)) data=data[data['value']<0.9] return data
解決方案:即便你已經(jīng)完成了分析,也要花時間注釋一下你做過什么。你會感謝自己的,當然其他人會更加感謝你!這樣你看起來會更專業(yè)!
把數(shù)據(jù)存成 csv 或 pickle
說回數(shù)據(jù),畢竟我們討論的是數(shù)據(jù)科學。就像函數(shù)和 for 循環(huán)一樣,CSV 和 pickle 文件也很常用,但它們其實并沒有那么好。CSV 不包含模式(schema),所以每個人都必須重新解析數(shù)字和日期。Pickle 可以解決這一點,但只能用在 Python 中,而且不能壓縮。這兩種格式都不適合存儲大型數(shù)據(jù)集。
def process_data(data, parameter): data=do_stuff(data) data.to_pickle('data.pkl') data=pd.read_csv('data.csv') process_data(data) df_train=pd.read_pickle(df_train)
解決方案:用 parquet 或者其他帶有數(shù)據(jù)模式的二進制數(shù)據(jù)格式,最好還能壓縮數(shù)據(jù)。d6tflow 可以自動將數(shù)據(jù)輸出存儲為 parquet,這樣你就不用解決這個問題了。
使用 Jupyter notebook
這個結論還有一些爭議——Jupyter notebook 就像 CSV 一樣常用。很多人都會用到它們。但這并不能讓它們變得更好。Jupyter notebook 助長了上面提到的許多不好的軟件工程習慣,特別是:
Jupyter notebook 很容易上手,但規(guī)模太小。
解決方案:用 pycharm 和/或 spyder。
原文鏈接:https://medium.com/m/global-identity?redirectUrl=https%3A%2F%2Ftowardsdatascience.com%2Ftop-10-coding-mistakes-made-by-data-scientists-bb5bc82faaee
要:本次分享主要介紹 Hive數(shù)據(jù)如何遷移到MaxCompute。MMA(MaxCompute Migration Assist)是一款MaxCompute數(shù)據(jù)遷移工具,本文將為大家介紹MMA工具的功能、技術架構和實現(xiàn)原理,再通過實際操作MMA,演示將Hive數(shù)據(jù)遷移到MaxCompute。
演講嘉賓簡介:阿里云智能產(chǎn)品專家-云花
精彩視頻回顧:Hive數(shù)據(jù)如何同步到MaxCompute
以下內容根據(jù)演講視頻以及PPT整理而成。本次分享主要圍繞以下兩個方面:一、MMA功能介紹、技術架構和原理二、MMA數(shù)據(jù)遷移操作演示
一、MMA功能介紹、技術架構和原理1.MMA功能介紹MMA主要覆蓋的場景包括批處理,存儲,數(shù)據(jù)集成,作業(yè)編排及調度。MMA提供遷移評估分析功能,自動化生成遷移評估報告。遷移評估報告會報告出從Hive表的數(shù)據(jù)結構到MaxCompute的數(shù)據(jù)結構之間是否有數(shù)據(jù)類型映射兼容性問題,如語法問題。MMA支持自動化數(shù)據(jù)遷移功能,支持批量建表以及數(shù)據(jù)自動化批量遷移。另外,MMA還支持作業(yè)語法分析,可以檢查Hive SQL能否直接運行在MaxCompute里。MMA還支持工作流遷移,對主流數(shù)據(jù)集成工具Sqoop進行作業(yè)的遷移轉換,并自動創(chuàng)新DataWorks數(shù)據(jù)繼承作業(yè)。
2.MMA遷移服務架構MMA遷移服務架構如下圖。左側是客戶Hadoop集群,右側的是Aliyun 大數(shù)據(jù)服務,主要是DataWorks和MaxCompute。MMA工具會跑在客戶的Hadoop集群上,客戶的服務器需要能夠訪問Hive Server。在機器上部署MMA客戶端工具時會自動化獲取Hive Meta里的數(shù)據(jù),既將Hive的Meta數(shù)據(jù)從MySQL中讀出來,還可以將Meta信息自動轉換成MaxCompute DDL,然后用DDL在MaxCompute中批量創(chuàng)建表,批量拉起數(shù)據(jù)同步的作業(yè),向Hive Server并發(fā)提交Hive SQL作業(yè)?;贖ive SQL作業(yè)調用一個UDF,UDF里面會集成Tunnel的SDK,基于Tunnel將數(shù)據(jù)批量寫到MaxCompute的表中。作業(yè)和工作流的遷移也是基于MMA客戶端工具自動發(fā)現(xiàn)的Hive Meta數(shù)據(jù),做工作流的作業(yè)檢查,包括把工作流的組件中的工作流的配置批量轉換成DataWorks工作流的配置,直接生成DataWorks工作流。以上步驟完成了數(shù)據(jù)到作業(yè)到工作流的遷移。最后一步是遷移完成后需要基于MaxCompute和DataWorks架構對接業(yè)務系統(tǒng)。
3.MMA Agent技術構架和原理通過客戶端和服務端,MMA可支持數(shù)據(jù)和工作流的批量遷移。安裝在客戶服務器上的MMA客戶端工具包含下圖中的四個能力。首先可自動獲取Hive Metadata,并自動創(chuàng)建生成DDL和UDTF,而且可批量創(chuàng)建表和批量Hive數(shù)據(jù)遷移。相應的,MMA有四個主要組件。Meta Carrier工具自動將Hive Meta信息提取出來,在本地生成Hive Meta結構。Meta Processor是基于Meta Carrier工具產(chǎn)出的結果,基于Hive Meta數(shù)據(jù)批量轉成MaxCompute的DDL,既批量轉成建表語句和數(shù)據(jù)類型的轉換。此外,MMA客戶端工具還內置了ODPS Console,基于ODPS Console將Meta Processor產(chǎn)出的ODPS DDL在MaxCompute上批量創(chuàng)建表。最后基于Data Carrier批量創(chuàng)建Hive SQL作業(yè)。每個Hive SQL作業(yè)相當于多個表或者多個分區(qū)并行的數(shù)據(jù)的同步。
二、MMA數(shù)據(jù)遷移操作演示1.環(huán)境準備如下圖所示,MMA環(huán)境運行要求是jdk1.6版本以上,Python3+。另外,運行MMA的機器,通過Hive Client提交Hive SQL的作業(yè)。機器還需要可以訪問Hive Server,并連接MaxCompute服務。下圖右側的場景案例是客戶在基于MMA做同步數(shù)據(jù)時發(fā)現(xiàn)的問題。例子中客戶有自己的IDC,在阿里云有自己的ECS,客戶從IDC拉一條專線訪問阿里云。在安裝MMA之前,客戶可以從ECS上直接訪問MaxCompute,但IDC里的機器不能訪問MaxCompute。此時需要在這條專線上增加VBR路由配置,既在邊界路由上增加一個配置。配置之后可以打通從IDC到ECS,甚至到MaxCompute服務的網(wǎng)絡訪問。
2.下載和編譯工具包下載編譯工具包有兩種方法。一是下載下圖中編譯好的工具包。此外,由于用戶的Hive版本各不相同,用戶可以根據(jù)MMA官網(wǎng)上提供的GitHub地址下載源碼,拉到本地進行編譯。
3.MMA Agent操作說明使用meta-carrier采集Hive Metadata:機器提前安裝好Hadoop環(huán)境,本地有Hive Server。提前下載客戶端的odps-data-carrier.zip包,并在本地解壓。解壓完成后會顯示下圖所示目錄。bin目錄下有幾個文件,首先是MMA的幾個核心角色:meta-carrier、meta-processor、odps_ddl_runner用于批量創(chuàng)建表,hive_udtf_sql_runner用于同步數(shù)據(jù)。libs目錄下是工具依賴的jar包和庫。 res目錄的console目錄下的bin目錄包含odpscmd,是MMA客戶端的工具,odps_config,ini配置文件。本地Hive上面有三個庫,其中dma_demo庫下有五個表,可將五個表自動批量同步到MaxCompute上。首先需要在MaxCompute上創(chuàng)建一個project,既在DataWorks控制臺創(chuàng)建一個空Project。打開新的命令窗口,在本地運行的ODPS Command客戶端工具,連接新創(chuàng)建的空的project。在已經(jīng)安裝了MMA Hive的機器上運行,解壓,進入odps-data-carrier工具的目錄。執(zhí)行 bin/meta-carrier -h查看其參數(shù)說明,-d表示用戶可以指定數(shù)據(jù)庫,通過指定數(shù)據(jù)庫提取meta數(shù)據(jù),若不指定,會將Hive下所有的庫的meta都拉取出來。-o指定輸出目錄,-t參數(shù)指定表,-u參數(shù)指定uri地址,即Hive Meta的地址。開始測試時首先指定地址,因為是thirft地址,所以用thirft協(xié)議連接。此外由于Hive Meta在本地,所以只需要將dma_demo庫的meta拉取出來,加-o參數(shù),指定目錄。通過tree meta可以查看meta目錄結構。meta目錄下生成和數(shù)據(jù)庫同名的dma_demo目錄。dma_demo目錄下的json文件是描述數(shù)據(jù)庫meta信息的文件。partition_meta里面的兩個表是分區(qū)表,table_meta的表是非分區(qū)表,會把所有表集的meta信息寫在下面。
使用network-measurement-tool:網(wǎng)絡測量工具network-measurement-tool用于網(wǎng)絡測速,測量Hive集群到MaxCompute各region的網(wǎng)絡連通質量。通過網(wǎng)絡測速可以知道網(wǎng)絡傳輸速度和大概的數(shù)據(jù)量,根據(jù)網(wǎng)絡傳輸速度預估數(shù)據(jù)傳輸時間。network-measurement-tool工具連接MaxCompute上所有region的節(jié)點ENDPOINT地址,由最快到最慢做測速排序。下圖中執(zhí)行結果最快的是HANGZHOU,連接時間為51ms,最慢的是一個海外region KUALA_LUMPUR,連接時間為3393ms。
使用sql-checker檢查Hive SQL是否可以直接在MaxCompute上執(zhí)行:sql-checker可用于檢查Hive SQL語法兼容性,判斷SQL能否直接在MaxCompute上運行。其參數(shù)input要指定meta目錄,指定缺省project和sql參數(shù)。若執(zhí)行結果返回其兼容性OK,即此sql語句可以直接在MaxCompute上運行。
使用meta-processor生成ODPS DDL和Hive UDTF SQL:通過第一步已經(jīng)拉出了Hive Meta庫的metadata信息。下一步需要將Hive Meta轉換成MaxCompute DDL。使用bin/meta-processor -h查看參數(shù)。-i即input,-o是output目錄。bin/meta-processor的-i就是第一個命令的輸出結果,代表meta的目錄,存放的是carrier拉出的Hive Meta數(shù)據(jù)。指定-i meta -o output。將bin/meta-processor運行結果放入output中。生成output目錄。tree output可查看結構。output目錄下也會生成一個以MaxCompute的project命名的dma_demo目錄。dma_demo目錄下面有一個hive_udtf_sql目錄,目錄下面的.sql用于批量數(shù)據(jù)遷移。還包含odps_ddl目錄,用于后續(xù)批量創(chuàng)建表,目錄下的.sql是創(chuàng)建表的語句。
使用odps_ddl_runner.py批量創(chuàng)建表和分區(qū):既然DDL已經(jīng)生成,下一步需要批量創(chuàng)建表。批量創(chuàng)建表依賴MaxCompute的命令行工具(客戶端工具)。工具包一級目錄下的odps_config包含幾個基本參數(shù),其中project_name、access_id、access_key、end_point為必填項。配置完成可以開始批量創(chuàng)建表。批量創(chuàng)建表工具要執(zhí)行Python命令,python36 bin/odps_ddl_runner.py -h。參數(shù)中input參數(shù)由meta processer自動生成,odpscmd參數(shù)不是必須指定的,它會默認找到所在目錄,不需要單獨配置參數(shù)。創(chuàng)建表過程要拉起odps_command工具,基于客戶端工具來向MaxCompute提交建表語句。通過show table查看是否創(chuàng)建了五個表,再查看分區(qū)是否也建好。若Hive和MaxCompute上的分區(qū)創(chuàng)建完成,兩邊的表結構也應相同。
使用hive_udtf_sql_runner.py遷移數(shù)據(jù):通過命令行python36 bin/hive_udtf_sql_runner.py開始讀output目錄下的.sql語句。查看python36 bin/hive_udtf_sql_runner.py命令的參數(shù),Input_all會批量遷移output下所有數(shù)據(jù)。若只想做單表的遷移或者單分區(qū)的遷移,需要使用input_single_file參數(shù)。parallelism參數(shù)表示并行度。數(shù)據(jù)遷移完成后在MaxCompute中查看表中是否有數(shù)據(jù)。對比MaxCompute中的數(shù)據(jù)和Hive中對應表的數(shù)據(jù)。若其size相同,Hive和MaxCompute中對應表的數(shù)據(jù)相同,說明已經(jīng)完整遷移數(shù)據(jù)。
進階功能1:僅生成指定的database或table的metadata:在生成meta時可以不生成整個數(shù)據(jù)庫的meta,可以指定一個表,生成一個表的meta。Meta carrier 工具提供了抓取指定數(shù)據(jù)庫可表的能力。
進階功能2:進靈活的hive到MaxCompute映射:如果用戶需要自定義MaxCompute上的表,可以更改命名,加前綴或后綴,修改自定義字段名。如可以修改MaxCompute DDL里的json文件實現(xiàn)表名或字段名的自定義。
進階功能3:單表或單分區(qū)遷移:上面的例子中已經(jīng)批量遷移五張表,通過drop table inventory,演示單分區(qū)遷移。首先若只需同步一個分區(qū)的數(shù)據(jù),需要重新創(chuàng)建一張表。執(zhí)行python36 bin/odps_ddl_runner.py創(chuàng)建表,指定其output目錄,開始批量創(chuàng)建表。此時inventory表以及其五個分區(qū)已經(jīng)創(chuàng)建完成。但創(chuàng)建的分區(qū)中沒有數(shù)據(jù),可指定其中一個分區(qū),如第二個分區(qū)。通過使用input_single_file參數(shù),指定具體分區(qū)的sql目錄??芍付夸洖閛utput/dma_demo/hive_udtf_sql/single_partition/inventory_1.sql。執(zhí)行完成后查看結果,對比在Hive上第二分區(qū)的數(shù)據(jù)和遷移進MaxCompute的單分區(qū)的數(shù)據(jù),若兩個單分區(qū)數(shù)據(jù)一致,則表示遷移完成。
4.使用DataWorks自動遷移數(shù)據(jù)和工作流MMA1.0版本還未將工作流遷移做成服務化功能,目前還是一個線下工具。客戶需要根據(jù)下圖模板生成相應目錄。在做工作流遷移時,如果使用開源組件,可以按照模板將配置放到相應目錄下。如果不使用開源組件,如自研的工作流調度編排服務,可基于標準化模板,按照模板的目錄結構生成用戶自己的工作流數(shù)據(jù),打成zip包上傳到DataWorks。目前MMA1.0還需要客戶手動打包文件上傳zip包,后臺會進行自動解析并加載到DataWorks工作流。上傳完成后,DataWorks服務會根據(jù)ODPS DDL 批量生成MaxCompute的table。MaxCompute表創(chuàng)建后,DataWorks服務會自動拉起DataX的數(shù)據(jù)同步任務,完成批量數(shù)據(jù)遷移。
下圖是可配置的項目描述文件project.xml,其中project信息可以自定義。另外一個是工作流描述文件,workflow.xml中是工作流自定義的參數(shù),用戶可以通過編輯配置文件進行修改。
5.其他類型作業(yè)的遷移方案UDF、MR遷移:用戶直接將jar包上傳到MaxCompute上,開啟2.0支持,開啟對Hive兼容的flag。將Hive兼容的flag設置為true,再在MaxCompute下直接遷移Hive下的UDF和MR。需求注意不支持UDF,MR中直接訪問文件系統(tǒng),網(wǎng)絡訪問和外部數(shù)據(jù)源連接。外表遷移:原則上能結構化的數(shù)據(jù)盡量遷移到MaxCompute內部表。如果必須通過外表訪問外部文件,建議先將數(shù)據(jù)從HDPS遷移到OSS或OTS,再在MaxCompute中創(chuàng)建外部表,實現(xiàn)對文件的訪問。Spark作業(yè)遷移:MMA對開源Spark的語法完全兼容。用戶只需要下載Spark On MaxCompute客戶端,在編寫Spark SQL時僅增加MaxCompute的連接參數(shù),其它部分和Spark SQL的語法相同。
6.查看遷移評估報告創(chuàng)建MaxCompute DDL完成后,除了生成DDL會SQL以外,還會生成遷移評估報告report.html文件。遷移評估報告是一個兼容性報告,顯示Hive表的數(shù)據(jù)結構和MaxCompute表的數(shù)據(jù)結構之間的映射關系是否有風險,并標識風險等級。另外會給出明細說明以及預警提示,如數(shù)據(jù)類型不兼容或語法不兼容等。用戶在遷移之前可以查看此報告評估遷移風險。
查看更多:https://yqh.aliyun.com/detail/6648?utm_content=g_1000106727
上云就看云棲號:更多云資訊,上云案例,最佳實踐,產(chǎn)品入門,訪問:https://yqh.aliyun.com/
口測試【接口:系統(tǒng)與系統(tǒng)之間,組件與組件之間,數(shù)據(jù)傳遞交互的通道】
1.1接口概念:指的是系統(tǒng)或組件之間的交互點,通過這些交互點可以實現(xiàn)數(shù)據(jù)的交互;可分為硬件接口和軟件接口;
服務器開了個口,客戶端發(fā)送請求
1.2接口的類型:
①按協(xié)議劃分:http、tcp、ip②按語言劃分:C++、java、php
③按范圍劃分,系統(tǒng)之間的接口和程序內部的接口
系統(tǒng)之間的接口:多個內部系統(tǒng)之間的交互【用戶系統(tǒng)、訂單系統(tǒng)、商品系統(tǒng)】,內部系統(tǒng)與外部系統(tǒng)【支付系統(tǒng)】之間的交互
程序內部的接口:方法與方法之間,函數(shù)與函數(shù)之間【傳入不同的數(shù)據(jù),輸出不同的值,叫接口函數(shù)】,模塊與模塊之間的交互
1.3接口測試的概念
接口測試:對系統(tǒng)或組件之間的接口進行測試,校驗傳遞的數(shù)據(jù)正確性和邏輯依賴關系(淘寶先登錄才能看訂單,即使復制了訂單的網(wǎng)頁,但是未登錄,復制的訂單網(wǎng)頁打開還是跳轉登錄界面。)的正確性。【校驗數(shù)據(jù)的交換、傳遞和控制管理的過程,以及相互邏輯依賴關系?!?/p>
1.4接口測試原理【接口測試主要測試目標:服務器,功能測試:測試客戶端】
1>怎么測?模擬客戶端,向服務器發(fā)送請求
2>用什么測?工具:fiddler、postman、jmeter;代碼:python+UnitTest框架+Requests框架
3>測試什么?測試服務器針對客戶端請求,回應的響應數(shù)據(jù)是否與預期結果一致
1.5特點
①測試可以提前介入,提早發(fā)現(xiàn)bug,符合質量控制前移的理念
②可以發(fā)現(xiàn)一些頁面操作發(fā)現(xiàn)不了的問題
③接口測試低成本高效益(底層的一個bug能夠引發(fā)上層8個左右bug,接口測試可以實現(xiàn)自動化)
④不同于傳統(tǒng)的單元測試,接口測試是從用戶的角度對系統(tǒng)進行全面的檢查
1.6實現(xiàn)方式
工具:fiddler、postman、jmeter;代碼:python+UnitTest框架+Requests框架
1.7自動化接口測試
接口自動化測試:借助工具、代碼,模擬客戶端發(fā)送請求給服務器,借助斷言自動判斷 預期結果和實際結果是否一致。【是讓程序或工具代替人工自動地完成對接口進行測試的一種過程】
(超文本傳輸協(xié)議,基于請求與響應模式的,應用層協(xié)議,也是互聯(lián)網(wǎng)上應用最為廣泛的一種協(xié)議)【端口是用來找到應用】
2.1 協(xié)議:就是規(guī)則。要求通信的雙方必須嚴格遵守。
2.2 特點
①支持客戶端/服務器模式 ②簡單快速 ③靈活 ④無連接 ⑤無狀態(tài)
2.3 URL(Uniform Resource Locator)統(tǒng)一資源定位符,是互聯(lián)網(wǎng)上標準資源的地址。HTTP使用URL來建立連接和傳輸數(shù)據(jù)。
作用:在網(wǎng)絡環(huán)境中,唯一的定義一個數(shù)據(jù)資源
2.4 URL語法格式(組成)【http:80;https:443】
http[協(xié)議] :// xxxxx[域名] : xxxx[端口:0~65535] / xxxxxx[資源路徑] ? xx[k=value]&xx&x[查詢參數(shù)]
協(xié)議:規(guī)定數(shù)據(jù)傳輸?shù)姆绞?/p>
域名:在網(wǎng)絡環(huán)境中找到主機 用://與協(xié)議分隔
端口(port)【常省略】:在網(wǎng)絡主機上,標識一個進程(運行起來的應用程序) 本地主機用PID標識 用 :與域名分隔
資源路徑:標識網(wǎng)絡資源(文件、圖片、音視頻、變量.....) 用/與端口分隔
查詢參數(shù):參數(shù)傳遞給資源路徑 用?與資源路徑分隔,內部用&分隔
【當資源路徑?jīng)]有時,可以認為是“/”】
2.5 HTTP請求【請求包;請求報文】
1>作用:
客戶端(app、瀏覽器),發(fā)送請求給服務器時,使用的協(xié)議--http請求協(xié)議
規(guī)定發(fā)送給服務器的數(shù)據(jù)傳輸?shù)恼Z法格式
2>整體格式
第一行:請求行:請求方法(空格)url(空格)協(xié)議版本
第二行:請求頭:語法格式 【格式:key:value】
user-agent:描述發(fā)送端的本地瀏覽器類型
Content-Type:xxxx(描述請求體的數(shù)據(jù)類型)通常碰到form(表單類型)和json類型
空行:代表http請求頭結束,請求體開始
請求體:請求發(fā)送時攜帶的數(shù)據(jù)。 數(shù)據(jù)類型(Content-Type)的值【post、put(相當于修改)有請求體,get、delete沒有請求體】
3>fiddler抓包驗證
先清空fiddler--訪問網(wǎng)站--點開(一般第一條)請求--點擊【raw】
4>請求行
http請求方法(大小寫無所謂)【對應數(shù)據(jù)庫增刪改查】
GET:查詢
POST:添加(常用在登錄)
PUT:修改
DELETE:刪除
5>請求頭
語法格式:k:v
user-agent:產(chǎn)生請求瀏覽器類型
Content-Type:請求體數(shù)據(jù)類型
application/json:JSON數(shù)據(jù)格式(k:v)
application/x-www-form-urlencoded:form表單數(shù)據(jù)
6>請求體
數(shù)據(jù)值的組織形式,受Content-Type的值影響
k=v格式
get、delete方法沒有請求體
post、put方法有請求體
2.6 HTTP響應
1>作用:服務器端,針對客戶端發(fā)送的http請求,回發(fā)響應數(shù)據(jù)。 --http應答
規(guī)定回發(fā)給客戶端的數(shù)據(jù)組織格式
2>整體格式【響應包;響應報文】
響應行(狀態(tài)行):協(xié)議版本(空格)狀態(tài)碼(空格)狀態(tài)描述【狀態(tài)碼和狀態(tài)描述捆綁,狀態(tài)碼對應狀態(tài)描述】
響應頭:語法格式:k:v
Content-Type:描述響應體中數(shù)據(jù)類型
空行:代表響應頭結束
響應體:絕大多數(shù)情況不為空(請求成功:回發(fā)數(shù)據(jù),失敗:回發(fā)錯誤數(shù)據(jù))
數(shù)據(jù)類型受Content-Type值影響
3>狀態(tài)碼【有三位數(shù)字組成,第一個數(shù)字定義響應的類別】
1xx:指示信息--表示請求已接收,等待繼續(xù)處理
**2xx:成功--表示請求已被成功接收、理解、接受:eg:200、201
3xx:重定向--待訪問的資源,需求重新指定路徑訪問?!疽瓿烧埱蟊仨氝M行更進一步的操作】
**4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn) eg:404【請求文件不存在】/403【請求文件存在但拒絕被訪問,也就是說沒有權限訪問】
5xx:服務器端錯誤--服務器未能實現(xiàn)合法的請求
4>狀態(tài)碼描述
一般與狀態(tài)碼唯一對應
5>響應頭
語法格式:k:v
Content-Type:值為響應體的數(shù)據(jù)類型
Content-Length:響應體的大小【可不寫,瀏覽器自動求取,一旦寫,必須準確】
6>響應體(測試中的實際結果,預期結果從接口文檔中來)
就是響應的消息體,數(shù)據(jù)可以是普通文本、XML、JSON、HTML源碼
1>傳統(tǒng)風格
對用戶進行操作的相關接口,包括增刪改查
操作 | 請求方式 | URL | 成功狀態(tài) |
查詢某個用戶 | GET/POST | http://127.0.0.1:8080/myweb/user/getUser?id=1 http://127.0.0.1:8080/myweb/user/getById?id=1 http://127.0.0.1:8080/myweb/getUserById?id=1 | 200 |
查詢所有用戶 | GET/POST | http://127.0.0.1:8080/myweb/user/getUserList http://127.0.0.1:8080/myweb/user/getUsers | 200 |
添加用戶 | POST | http://127.0.0.1:8080/myweb/user/addUser | 200 |
修改用戶 | POST | http://127.0.0.1:8080/myweb/user/updateUser | 200 |
刪除用戶 | GET/POST | http://127.0.0.1:8080/myweb/user/deleteUser?id=1 | 200 |
特點:
請求方法,只使用get和post即可
URL不唯一,不重復。同一個操作可以對應不同的URL
狀態(tài)碼的使用較單一。200最常見
2>RESTful風格接口【一種軟件架構風格、設計風格,而不是標準,只是提供了一組設計原則和約束條件】
REST:即(Representational State Transfer)的縮寫,詞組翻譯是“表現(xiàn)層狀態(tài)轉化”【同一URL,對應的方法不同,對應的操作也不同】,如果一個架構符合REST原則,就稱它為RESTful架構。
操作 | 請求方式 | URL | 成功狀態(tài) |
查詢某個用戶 | GET | http://127.0.0.1:8080/myweb/users/1 | 200 |
查詢所有用戶 | GET | http://127.0.0.1:8080/myweb/users | 200 |
添加用戶 | POST | http://127.0.0.1:8080/myweb/users | 201 |
修改用戶 | PUT | http://127.0.0.1:8080/myweb/users/1 | 201 |
刪除用戶 | DELETE | http://127.0.0.1:8080/myweb/users/1 | 204 |
架構特點:
1.每一個URL代表一種資源;
2.客戶端和服務器之間,傳遞這種資源的某種表現(xiàn)層;
3.客戶端通過四個HTTP動詞,對服務器端資源進行操作,實現(xiàn)“表現(xiàn)層狀態(tài)轉換”(數(shù)據(jù)的不同表現(xiàn)形式,圖像、文字表現(xiàn)同一個數(shù)據(jù)對象)
4.接口之間傳遞的數(shù)據(jù)最常用格式為JSON。
5.1接口文檔
1>接口文檔:又稱為API文檔,一般是由開發(fā)人員所編寫的,用來描述系統(tǒng)所提供接口信息的文檔。大家都根據(jù)這個接口文檔進行開發(fā),并需要一直維護和遵守。
2>作用
1.能夠讓前端開發(fā)與后臺開發(fā)人員更好的配合,提高工作效率。(有一個統(tǒng)一參考的文件)
2.項目選代或者項目人員更迭時,方便后期人員查看和維護
3.方便測試人員進行接口測試
【錯誤碼:不是錯誤,與http狀態(tài)碼區(qū)分開,其實是狀態(tài)碼,描述狀態(tài)】
形式:word文檔形式、Excel表格式形式、pdf文檔
基本信息:
Path:對應url里的資源路徑(url前面的協(xié)議等在接口文檔的系統(tǒng)信息里呈現(xiàn))
Method:PUT/POST/DELETE/GET
接口描述:。。。。。
請求參數(shù):
Headers(請求頭):數(shù)據(jù)類型(k【Content-Type】:v【application/json】)
Body(請求體):實現(xiàn)該接口使用的數(shù)據(jù)以及對應類型。
返回數(shù)據(jù)(預期結果):成功和失敗的狀態(tài)碼
狀態(tài)碼:200 成功:狀態(tài)碼200
錯誤碼(自定義狀態(tài)碼):碼值和描述信息 失?。哄e誤碼(自定義狀態(tài)碼)
5.2接口文檔解析
接口文檔的解析本質:從接口文檔中,找出http請求所需要的數(shù)據(jù)信息,包括:
請求方法、URL【行里兩個】、請求頭(k:v)【Content-Type類型】、請求體【數(shù)據(jù):數(shù)據(jù)類型的名字和類型】(行頭體)、響應狀態(tài)碼、描述。
Eg:
請求體:{“數(shù)據(jù)類型的名字,建議復制文檔里的不要用手敲”:“數(shù)據(jù)值,文檔中不知道,可找開發(fā)要”}
Fiddler:
K:v是json類型數(shù)據(jù)
Raw項:方法、url、請求頭、請求體
6.1為什么要寫
1.防止測試點漏測、條理清晰
2.方便分配工作,評估工作量和時間
3.面試使用
6.2接口測試的測試點(測試維度)
6.3功能測試
手工測試中的單個業(yè)務模塊,一般對應一個接口。
Eg: 登錄業(yè)務-->登錄接口
加入購物車業(yè)務-->加入購物車接口
支付業(yè)務-->支付接口
.........
借助工具、代碼,繞開前端界面,組織接口所需要的數(shù)據(jù),展開接口測試。
按照用戶實際使用場景,梳理接口業(yè)務場景。
組織業(yè)務場景時,一般只需要做正向測試即可。(與手工一致)
一般建議用最少的用例覆蓋最多的業(yè)務場景。
Eg:登錄---搜索商品---加購物車---下單---支付---評價
6.4性能測試
1>響應時長:發(fā)送請求,服務器多久回發(fā)響應
2>吞吐量:當前的接口處理用戶的請求事物數(shù)量
3>并發(fā)數(shù):多個用戶同時向接口發(fā)請求,比如淘寶秒殺
4>服務器資源利用率:CPU、內存、顯卡、網(wǎng)絡I/O、磁盤I/O
6.5瀏覽器開發(fā)者工具
瀏覽器的開發(fā)者工具:F12或右鍵檢查打開--->Network--->一定要選擇ALL--->關于登錄,可以在網(wǎng)站界面輸入好數(shù)據(jù),點擊登錄按鈕--->查看
點擊Name下數(shù)據(jù)--->do_login(與登錄按鈕對應):
Headers【相當于HTTP響應,組織形式不一樣,但是數(shù)據(jù)該有的都有】:
General:表示總則;包括請求URL、請求方法、狀態(tài)碼(Status Code)、IP地址和端口號(Remote Address)
Response Headers:表示響應頭;數(shù)據(jù)以k:v形式組織
Request Headers:表示請求頭;對應HTTP請求頭里的信息;數(shù)據(jù)類型依然k:v形式
Query String Parameters:表示查詢字符串參數(shù),對應url后部分的查詢參數(shù)
Form Data:表單數(shù)據(jù);比如登錄界面,這部分是登錄界面輸入的數(shù)據(jù)
Payload:有一個view source,是請求體的數(shù)據(jù),可以直接復制json數(shù)據(jù)
Response【查看服務器響應返回的結果】
6.6安全測試
1>攻擊安全:由專業(yè)安全測試工程師完成;
2>業(yè)務安全
①敏感數(shù)據(jù)是否加密:比如密碼
②SQL注入:
輸入用戶名為:‘ or 1=1#,提示用戶名格式錯誤,表示沒有SQL注入的漏洞
③其他
6.7與手工測試區(qū)別
1>手工測試測寫入到輸入框中的數(shù)據(jù)是否正確。接口測試測參數(shù)對應的參數(shù)值是否正確,相當于k:v。
2>接口測試不單單針對參數(shù)值進行測試,還可以針對參數(shù)本身進行測試。比如測username本身,用uname:正確的用戶名去測試,看看能否通過。
對于參數(shù)測:
①正向參數(shù):
必選參數(shù):所有的必填項都包含。
組合參數(shù):所有的必填+任意一個或多個可選參數(shù)
全部參數(shù):所有的必填+所有的可選參數(shù)
②反向參數(shù):
多參:多出一個或多個必選參數(shù)(可以任意指定)
少參:缺少一個或者多個必選參數(shù)
無參:沒有必選參數(shù)
錯誤參數(shù):參數(shù)名輸入錯誤
6.8接口測試文檔要素
編號、用例名稱(標題)、模塊、優(yōu)先級、預置條件、請求方法、URL、請求頭、請求體(請求數(shù)據(jù))、預期結果
URL列:寫完整URL或者寫{協(xié)議+域名}/文檔里的path內容【path寫明確,協(xié)議和域名可寫成文字,以防后期協(xié)議和域名修改,就不用大篇幅修改】
登錄里的用戶名未注冊就是不存在
3>數(shù)值部分和手工測試一樣,參數(shù)是接口特有的。
用戶名和密碼為空不能想當然認為都是用戶名或密碼錯誤,要去實踐。
登錄的信息都是去數(shù)據(jù)庫中比對,如果特殊字符等在數(shù)據(jù)庫中不允許出現(xiàn),就不用做此類反向測試。要在數(shù)據(jù)庫中組織出不符合的數(shù)據(jù),測開發(fā)在接收數(shù)據(jù)的時候,不能依托數(shù)據(jù)庫,而是依托開發(fā)的代碼有沒有校驗出來,不符合規(guī)范的手機號是否能登錄成功。
總結:在接口測試用例中,對于k:v,考慮k的正反向,v保證正確;考慮v的正反向,k保證正確。
8.1分析測試點
Eg:針對“員工管理”業(yè)務場景:登錄---添加員工---查詢員工(看看是否添加成功)---修改員工---再次查詢(看看修改成功)---刪除員工---查詢員工(看看是否刪除)【相當于把多個模塊接口串起來,用最少的用例盡可能的覆蓋所有接口】
8.2添加用戶【測校驗的情況:正確、錯誤、重復】
請求方法:post
URL:
請求頭:
請求體:
返回數(shù)據(jù):
8.3查詢員工【測校驗的情況:正確、空值、錯誤值】
8.4修改員工
8.5刪除員工
9.1開發(fā)者工具
Headers:請求方法、request URL、request headers中的content-type【代表數(shù)據(jù)類型,后面的utf可以不管】、Form data【請求體,k:v對】
Preview:返回數(shù)據(jù)中看不懂的字符,在preview里能找到
Response:看返回數(shù)據(jù)【漢字的轉碼在preview里】
9.2Postman使用
Postman:
Headers:填寫content-type的k:v值
Body:下拉框選項選擇content-type中的v項,然后填入請求體中的k:v對,是json就選擇raw【原始】
Send完看響應數(shù)據(jù),在body下,選擇pretty,把html改成json,就可以看到返回的結果了
結果:
點擊sava或ctrl+s,小紅點就沒有了
總體步驟:
**3.1斷言響應狀態(tài)碼
選擇:Status code:code is 200
詳情:pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
解釋:
pm:代表postman的一個實例【類下面的一個對象】
test():是pm實例的一個方法。有兩個參數(shù)
參數(shù)1:在斷言成功后,給出的文字提示,可以修改。"Status code is 200"
參數(shù)2:匿名函數(shù),function () {pm.response.to.have.status(200);}
function代表函數(shù),后面應該放函數(shù)名,但是沒有,所以是匿名函數(shù);
response代表響應體,to.have應該有
整句話表示:postman的響應結果中應該包含狀態(tài)碼200
200是預期結果
斷言的結果在Tests項下Test Results,看到PASS和Status code is 200【對應斷言成功后的描述】
3.2斷言響應體是否包含某個字符串
選擇:Response body:Contains string
詳情:pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("string_you_want_to_search");
});
解釋:預期結果用返回體內的value值,推薦用message的value
3.3斷言響應體是否等于某個字符串(對象)【json花括號括起來是對象,中括號括起來是數(shù)組】
選擇:Response body:Is equal to a string
詳情:pm.test("Body is correct", function () {
pm.response.to.have.body("response_body_string");
});
解釋:通常data對應令牌數(shù)據(jù)會不停地改變,這個字符串是對返回的全部字符串進行判斷,一旦有數(shù)據(jù)不停變化時,斷言不通過。
**3.4斷言JSON數(shù)據(jù)
選擇:Response body:JSON value check
詳情:pm.test("Your test name", function () {
var jsonData=pm.response.json();
pm.expect(jsonData.value).to.eql(100);
});
解釋:
var jsonData=pm.response.json(); var jsonData用js語法定義一個變量;jsonData是變量名;pm.response.json()代表響應的json結果,就是響應的數(shù)據(jù)
pm.expect(jsonData.value).to.eql(100); 預期json結果值等于100相同,value對應響應體中的key
3.5斷言相應頭【返回的Headers里】
選擇:Response headers:Content-Type header check
詳情:pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
解釋:響應頭中包含Content-Type;可以判定k:v是否正確,斷言響應頭所對應的value,直接(k,v)
示例:pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type","application/json");
});【在響應的headers中,添加響應頭中的key對應的value判定,用,分隔】
15.1概念
全局變量:全局變量是全局唯一的,不可重復定義的變量
環(huán)境變量:一個變量只能屬于某個環(huán)境,在某一個環(huán)境中變量不可重復定義;在環(huán)境與環(huán)境之間可以定義重復的變量;一個環(huán)境可以包含多個環(huán)境變量;常見環(huán)境分類:開發(fā)環(huán)境、測試環(huán)境、生產(chǎn)環(huán)境【一個項目生產(chǎn)部署上線】
15.2設置變量
全局變量:
環(huán)境變量:
15.3獲取變量【請求參數(shù)是從params、headers、url中拿出來的,只要從界面中獲取的[相當于從兩個請求的postman界面中獲取的];請求參數(shù)只能用在請求參數(shù)中,不可以用在代碼區(qū)域{tests、請求前置腳本},可用在params、headers、bodys中】
全局變量:
環(huán)境變量:
【獲取都用要一個變量去接收,多級的要一級一級取】
16.1地位:在send按鈕點擊后,請求前置腳本代碼,第一時間被執(zhí)行。在postman內部實際http請求之前。
16.2時間戳
概念:對應絕對時間----從1970年1月1日00:00:00到現(xiàn)在所經(jīng)歷的秒數(shù)
16.3案例
調用百度首頁接口,傳時間戳給服務器
實現(xiàn)步驟:
①拿到時間戳寫入全局變量
//拿到時間戳數(shù)據(jù)值
var timestamp = new Date().getTime()
//將時間戳設置到全局變量中
pm.globals.set("glb_timestamp",timestamp)
②點擊send按鈕,發(fā)送請求。請求發(fā)送前執(zhí)行上述代碼,寫入全局變量
③查看寫入的變量:點擊眼睛圖標
④在請求參數(shù)(界面)中,使用全局變量。{{var_name}}【params是查詢參數(shù)】
⑤在postman控制臺,查看發(fā)送的http請求
【send發(fā)送請求之前會執(zhí)行請求前置腳本,寫進全局變量當中,再發(fā)送請求】
17.1介紹:應用于多個http請求之間,有數(shù)據(jù)關聯(lián)、或依賴關系時。
17.2實現(xiàn)步驟
A接口依賴B接口的數(shù)據(jù)
①向B接口發(fā)送http請求,獲取數(shù)據(jù)
②將數(shù)據(jù)保存至全局變量(環(huán)境變量)中
③A接口獲取全局變量(環(huán)境變量)中數(shù)據(jù)值,進行使用
17.3案例
請求獲取天氣接口,提取響應結果中的城市,將城市名,給百度搜索接口使用
①發(fā)送天氣接口請求,在天氣接口的Tests中獲取城市名,再把城市名寫入
//獲取全部響應結果
var jsondate=pm.response.json()
//從響應結果中,獲取城市名
var city=jsondate.一級一級往下引用k名
//將城市名寫入到全局變量
pm.globals.set(“city”,city)
【點擊send按鈕,發(fā)送請求,查看設置的全局變量。點擊小眼睛,看全局變量名和全局變量值】
//修改百度搜索請求,使用全局變量,按城市名進行搜索
18.1批量執(zhí)行用例集
Data:引入外部文件
18.2生成測試報告(newman)【在dos界面】
1.先把用例集執(zhí)行,run
2.導出用例集
3.生成測試報告
①{ newman run 測試腳本文件【導出的json文件】}[可單獨執(zhí)行] -e 環(huán)境變量文件【沒有環(huán)境變量就省略】 -d 測試數(shù)據(jù)文件 -r html【必寫】 --reporter-html-export report.html【報告名稱,report名可以修改】
【比如:登錄接口,測一個用戶,請求體的數(shù)據(jù)是寫死的,要是測1000個用戶,需要用到參數(shù)化】
【當http請求,使用的數(shù)據(jù)有較高相似度時,相同的請求時,考慮使用參數(shù)化(將數(shù)據(jù)組織到數(shù)據(jù)文件中)】
19.1數(shù)據(jù)文件簡介
CSV:
優(yōu)點:數(shù)據(jù)組織形式簡單,適用于大量數(shù)據(jù)的場合
缺點:不支持bool類型數(shù)據(jù)(數(shù)據(jù)被postman讀入后,自動添加“”包裹bool值);不支持多參、少參、無參、錯誤參數(shù)的接口測試;不支持復雜數(shù)據(jù)類型(如嵌套字典、列表)
【數(shù)值直接拿去用,非數(shù)值都加上“”】
JSON:
優(yōu)點:支持bool類型;支持多參、少參、無參、錯誤參數(shù)的接口測試;支持復雜數(shù)據(jù)類型(如嵌套字典、列表)
缺點:對于相同的數(shù)據(jù)量,JSON數(shù)據(jù)文件大小要遠大于CSV文件
19.2導入外部數(shù)據(jù)文件
CSV:【一定要utf8編碼】
①創(chuàng)建XXX.CSV數(shù)據(jù)文件
②將數(shù)據(jù)寫入到CSV文件中:第一行寫入的是數(shù)據(jù)對應的字段名;從第二行向后依次是對應的數(shù)值,數(shù)據(jù)間用英文,分隔
③在Postman中,選中使用數(shù)據(jù)文件的用例集,導入數(shù)據(jù)文件【run->data:select file->選擇導入文件->通過preview預覽按鈕,校驗數(shù)據(jù)文件是否正確】
JSON:【可在json.cn網(wǎng)站里編寫,編寫好復制粘貼到記事本打開的json文件中】
①創(chuàng)建XXX.JSON數(shù)據(jù)文件
②在數(shù)據(jù)文件中,按json語法寫入json數(shù)據(jù)。Postman要求,json格式的數(shù)據(jù)文件,數(shù)據(jù)內容的最外層,必須是[ ]。內部所有的數(shù)據(jù)用{ }存儲
③在Postman中,選中使用數(shù)據(jù)文件的用例集,導入數(shù)據(jù)文件【run->data:select file->選擇導入文件->通過preview預覽按鈕,校驗數(shù)據(jù)文件是否正確】
【建議書寫json數(shù)據(jù)時,無論是不是字符串,都可以用” ”包裹value值】
19.3讀取數(shù)據(jù)文件數(shù)據(jù)
1.方法
①請求參數(shù)(請求行、請求頭、請求體)中,使用數(shù)據(jù)文件中的數(shù)據(jù)
使用{{}}包裹csv文件字段名或json文件中的key
②代碼(斷言、請求前置腳本)中,使用數(shù)據(jù)文件中的數(shù)據(jù)
需要借助postman提供的關鍵字data點【.】csv文件字段名或json文件中的key
【send不能讀外部數(shù)據(jù)文件,用到外部數(shù)據(jù)文件了,讀取要進入到run里,通過run參數(shù)化用例集的按鈕批量執(zhí)行。如果有異常,借助控制臺。】
小結:借助數(shù)據(jù)文件,實現(xiàn)“數(shù)據(jù)驅動”。有多少條數(shù)據(jù),對應就有多少個http請求。
19.4生成測試報告
步驟:
①批量執(zhí)行測試用例(借助數(shù)據(jù)文件)
②導出測試用例集(建議與數(shù)據(jù)文件放在一起)
③執(zhí)行生成測試報告的命令
Newman run 用例集名稱.json -d 數(shù)據(jù)文件名.csv/.json -r html --reporter-html-export 報告名稱.html
拿到一個項目,要對項目整體有個認識:熟悉項目的功能;了解項目組織架構和相應技術。
20.1功能模塊:XXXXXX【模塊功能列出】
20.2技術棧
前端:頁面顯示........
后端:spring全家桶;mysql【實現(xiàn)數(shù)據(jù)持久化存儲,斷電也不會丟】+redis【緩存存儲數(shù)據(jù),讀取快】+rabbitmq【消息隊列,完成數(shù)據(jù)通信】
20.3技術架構圖(比較詳細展開描述技術棧)
20.4初始化項目環(huán)境(利用postman)
①先創(chuàng)建環(huán)境,給環(huán)境取名【測試、開發(fā)、生成】
②initial value:在外部數(shù)據(jù)文件中使用,current value:在postman中使用
【注意】:設置了環(huán)境,在執(zhí)行用例的時候要選擇對應環(huán)境
20.5數(shù)據(jù)依賴
1.登錄成功,返回的“令牌”,被增刪改查功能接口依賴
2.添加完的數(shù)據(jù)id,會被查、改、刪依賴
【借助關聯(lián)和環(huán)境變量實現(xiàn)】
20.6提取令牌
1.登錄完成,返回data,不是完整令牌,缺少前綴
2.實現(xiàn):
①發(fā)送http登錄請求,在響應體中得到data值
var json_data = pm.response.json()
var env = json_data.data.token
②將data值拼接“Bearer”和“空格”,組成一個合法令牌
pm.environment.set("env","Bearer"+" "+env)
③將令牌寫入環(huán)境變量中。(在Tests中通過代碼寫入)
20.7生成測試報告
1.在environment中有環(huán)境,要先導出環(huán)境
2.將環(huán)境文件與測試用例集放置到同一目錄下
3.執(zhí)行命令
663
*請認真填寫需求信息,我們會在24小時內與您取得聯(lián)系。