整合營銷服務商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          數(shù)據(jù)科學家易犯的十大編碼錯誤,你中招了嗎?

          數(shù)據(jù)科學家易犯的十大編碼錯誤,你中招了嗎?

          據(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ù)。

          • Cookiecutter Data Science:https://drivendata.github.io/cookiecutter-data-science/#directory-structure
          • d6tflow 項目模板:https://github.com/d6t/d6tflow-template

          用 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。

          • DVC:https://dvc.org/
          • Git Large File Storage:https://git-lfs.github.com/

          寫函數(shù)而不是 DAG

          數(shù)據(jù)已經(jīng)討論得夠多了,接下來我們談談實際的代碼。你在學編程時,首先學的就是函數(shù),數(shù)據(jù)科學代碼主要由一系列線性運行的函數(shù)組成。這會引發(fā)一些問題,詳情請參閱「4 Reasons Why Your Machine Learning Code is Probably Bad。」

          • 地址:https://towardsdatascience.com/4-reasons-why-your-machine-learning-code-is-probably-bad-c291752e4953
          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ù)的示例代碼如下:

          • d6tstack:https://github.com/d6t/d6tstack
          • d6tjoin:https://github.com/d6t/d6tjoin/blob/master/examples-prejoin.ipynb
          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,這樣你就不用解決這個問題了。

          • parquet:https://github.com/dask/fastparquet

          使用 Jupyter notebook

          這個結論還有一些爭議——Jupyter notebook 就像 CSV 一樣常用。很多人都會用到它們。但這并不能讓它們變得更好。Jupyter notebook 助長了上面提到的許多不好的軟件工程習慣,特別是:

          1. 你會把所有文件存在一個目錄中;
          2. 你寫的代碼是自上而下運行的,而不是 DAG;
          3. 你不會模塊化你的代碼;
          4. 代碼難以調試;
          5. 代碼和輸出會混合在一個文件中;
          6. 不能很好地進行版本控制。

          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ā)送請求給服務器,借助斷言自動判斷 預期結果和實際結果是否一致。【是讓程序或工具代替人工自動地完成對接口進行測試的一種過程】

          二、HTTP協(xié)議

          (超文本傳輸協(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。

          四、接口測試流程

          1. 需求分析:主要依據(jù)需求文檔(產(chǎn)品)
          2. 接口文檔解析:一般是由開發(fā)人員編寫的接口文檔(API文檔)
          3. 設計接口測試用例(根據(jù)接口文檔產(chǎn)生用例,送審)
          4. 執(zhí)行測試用例:使用接口測試工具實現(xiàn)(postman、jmeter);通過編寫代碼實現(xiàn)(python+requests+unittest)
          5. 接口缺陷的管理和跟蹤
          6. 生成測試報告
          7. 接口自動化持續(xù)集成(可選)

          五、接口文檔的作用和展現(xiàn)形式

          5.1接口文檔

          1>接口文檔:又稱為API文檔,一般是由開發(fā)人員所編寫的,用來描述系統(tǒng)所提供接口信息的文檔。大家都根據(jù)這個接口文檔進行開發(fā),并需要一直維護和遵守。

          2>作用

          1.能夠讓前端開發(fā)與后臺開發(fā)人員更好的配合,提高工作效率。(有一個統(tǒng)一參考的文件)

          2.項目選代或者項目人員更迭時,方便后期人員查看和維護

          3.方便測試人員進行接口測試

          1. 展現(xiàn)形式

          【錯誤碼:不是錯誤,與http狀態(tài)碼區(qū)分開,其實是狀態(tài)碼,描述狀態(tài)】

          形式:word文檔形式、Excel表格式形式、pdf文檔

          1. 結構

          基本信息:

          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功能測試

          1. 單接口功能

          手工測試中的單個業(yè)務模塊,一般對應一個接口。

          Eg: 登錄業(yè)務-->登錄接口

          加入購物車業(yè)務-->加入購物車接口

          支付業(yè)務-->支付接口

          .........

          借助工具、代碼,繞開前端界面,組織接口所需要的數(shù)據(jù),展開接口測試。

          1. 業(yè)務場景功能

          按照用戶實際使用場景,梳理接口業(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é)議和域名修改,就不用大篇幅修改】

          登錄界面

          1. 操作成功不代表登錄成功,只能說http請求已經(jīng)被服務端處理了。會出現(xiàn)狀態(tài)碼
          2. 預期結果包括狀態(tài)碼和描述信息;data數(shù)據(jù)包括當前用戶登錄的身份,下次只要核對data的值,登錄成功會產(chǎn)生令牌(token,隔段時間會變)數(shù)據(jù)(data的值)表明用戶已經(jīng)登錄進去了

          登錄里的用戶名未注冊就是不存在

          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保證正確。

          業(yè)務場景功能

          8.1分析測試點

          Eg:針對“員工管理”業(yè)務場景:登錄---添加員工---查詢員工(看看是否添加成功)---修改員工---再次查詢(看看修改成功)---刪除員工---查詢員工(看看是否刪除)【相當于把多個模塊接口串起來,用最少的用例盡可能的覆蓋所有接口】

          8.2添加用戶【測校驗的情況:正確、錯誤、重復】

          請求方法:post

          URL:

          請求頭:

          請求體:

          返回數(shù)據(jù):

          8.3查詢員工【測校驗的情況:正確、空值、錯誤值】

          8.4修改員工

          8.5刪除員工

          POSTMAN

          1. 官網(wǎng)下載postman:https://app.getpostman.com/app/download/win64
          2. 下載node.js:https://nodejs.org/zh-cn/download/,為了安裝newman
          3. 安裝newman:npm install -g newman
          4. 為newman安裝newman-reporter-html【newman是postman插件,newman-reporter-html是newman的插件】,安裝命令:npm install -g newman-reporter-html

          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,就可以看到返回的結果了

          結果:

          階段目標劃分

          Postman管理測試用例collections

          1. 創(chuàng)建collections
          2. Add request:創(chuàng)建用例,添加請求

          點擊sava或ctrl+s,小紅點就沒有了

          1. Add folder:創(chuàng)建子目錄

          用例集導出、導入

          1. export:導出,在用例集名稱右側的三點中,一般默認選項導出
          2. 文件名后綴不可改,文件名不建議修改,只有第一段文字可修改,接口集成時,不可以用中文命名
          3. Import:導入,file->upload files->選文件位置

          Postman斷言

          1. 斷言:讓程序判斷預期結果與實際結果是否一致。
          2. 特點:postman斷言是使用JavaScript語言編寫的,寫在Tests標簽頁里【對應框上面有Tests選項】
          3. postman常用斷言【在<中選擇對應的就可以,代碼自動生成】

          總體步驟:

          • 在Tests標簽中,選擇斷言方法適當調整test()方法參數(shù)1,和匿名函數(shù)中的預期結果點擊send按鈕,發(fā)送請求,執(zhí)行斷言代碼。查看斷言結果

          **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判定,用,分隔】

          Postman斷言工作原理

          全局變量和環(huán)境變量

          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設置變量

          全局變量:

          • 手動設置代碼設置:pm.globals.set(“var_name”,value);【變量名必須要雙引號】

          環(huán)境變量:

          1. 手動設置
          2. 代碼設置:pm.environment.set(“var_name”,value);

          15.3獲取變量【請求參數(shù)是從params、headers、url中拿出來的,只要從界面中獲取的[相當于從兩個請求的postman界面中獲取的];請求參數(shù)只能用在請求參數(shù)中,不可以用在代碼區(qū)域{tests、請求前置腳本},可用在params、headers、bodys

          全局變量:

          • 請求參數(shù)中獲?。簕{var_name}}代碼中獲?。簐ar value=pm.globals.get(“var_name”);【取的時候只要變量名】

          環(huán)境變量:

          1. 請求參數(shù)中獲取:{{var_name}}
          2. 代碼中獲取:var value=pm.environment.get(“var_name”);【取的時候只要變量名】

          【獲取都用要一個變量去接收,多級的要一級一級取】

          請求前置腳本

          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ā)送請求】

          Postman關聯(lián)

          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ā)送請求,查看設置的全局變量。點擊小眼睛,看全局變量名和全局變量值】

          //修改百度搜索請求,使用全局變量,按城市名進行搜索

          Postman測試報告

          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名可以修改】

          Postman讀取外部數(shù)據(jù)文件(參數(shù)化)

          比如:登錄接口,測一個用戶,請求體的數(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

          項目環(huán)境說明

          拿到一個項目,要對項目整體有個認識:熟悉項目的功能;了解項目組織架構和相應技術。

          20.1功能模塊:XXXXXX【模塊功能列出】

          20.2技術棧

          前端:頁面顯示........

          后端:spring全家桶;mysql【實現(xiàn)數(shù)據(jù)持久化存儲,斷電也不會丟】+redis【緩存存儲數(shù)據(jù),讀取快】+rabbitmq【消息隊列,完成數(shù)據(jù)通信】

          20.3技術架構圖(比較詳細展開描述技術棧)

          20.4初始化項目環(huán)境(利用postman)

          1. 新建用例集(不同的模塊對應添加子目錄)
          2. 創(chuàng)建環(huán)境變量(選擇Enviroments->create enviroment)

          ①先創(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


          主站蜘蛛池模板: 成人无码AV一区二区| 无码一区二区三区AV免费| 亚洲第一区香蕉_国产a| 亚洲影视一区二区| 合区精品久久久中文字幕一区| 国产精品无码一区二区三区免费| 人妻天天爽夜夜爽一区二区| 日韩精品无码一区二区中文字幕| 国产99久久精品一区二区| 激情爆乳一区二区三区| 色国产精品一区在线观看| 内射少妇一区27P| 亚洲香蕉久久一区二区| 99精品久久精品一区二区| 在线免费视频一区| 91一区二区三区四区五区| AV无码精品一区二区三区宅噜噜| 五十路熟女人妻一区二区| 久久国产一区二区| 青娱乐国产官网极品一区| 影音先锋中文无码一区| 日本免费一区二区久久人人澡| 国产一区二区精品在线观看| 国产精品视频分类一区| 午夜福利一区二区三区在线观看| 一区二区视频免费观看| 久久久久人妻精品一区| 国产在线aaa片一区二区99| 国产精品99精品一区二区三区| 一区高清大胆人体| 国精产品一区一区三区免费视频 | 国产成人精品一区在线| 亚洲色偷偷偷网站色偷一区| 香蕉在线精品一区二区| 国产a久久精品一区二区三区| 亚洲AV无码一区二区三区牛牛| 无码日韩精品一区二区三区免费 | 亚洲视频在线一区二区| 国产伦精品一区二区三区免.费| 亚洲AV噜噜一区二区三区| 国产美女在线一区二区三区|