互聯網服務端接口自動化是各個公司都須要一部分業務,如何快速高效地完成接口測試呢?面試
以幫助你們實現高效的接口測試爲出發點,本文包含了我在互聯網接口測試領域的一些方法和心得,但願你們一塊兒討論和分享,內容包括但不只限於:算法
互聯網服務端接口測試介紹;數據庫
接口測試經常使用的工具、平臺、框架;編程
接口測試的一些問題和實踐。瀏覽器
下圖是經典的測試金字塔,服務接口測試在中部,承上啓下,因而可知其重要性。緩存
互聯網服務端接口測試介紹安全
目前市場上有不少支持接口測試的工具,可以提升測試效率。可是讓你一天完成100個接口測試任務,你以爲可能嗎?服務器
你可能會說有工具就行,但不是全部工具都能支持你完成這個任務。下圖是我挑選的幾款工具:網絡
1. fiddler數據結構
fiddler是一個 HTTP 協議調試代理工具,Web和手機測試都會用到,同時也支持接口測試。後面我會專門介紹。
2. postman
它是 Google 開發的一個插件,安裝在 Chrome 瀏覽器上,能支持不一樣接口測試請求,能夠管理測試套件和自動化運行。弱點是自動化斷言功能不強大,不能和 Jenkins、代碼管理庫進行持續集成測試。
可是,它絕對是一個很好的半手工、半自動化測試工具。我通常在寫自動化接口測試用例,會打開 postman 進行輔助測試和 Debug,下文會有介紹。
3. wireshak
這是一款抓包工具,支持 TCP、UDP、HTTP 。若是作底層網絡數據測試,通常都須要用到它,可是用做接口測試,它就有點不友好。由於刷新數據太快,很差定位每一個操做對應的接口。因此,在這裏就不過多介紹該工具。
4. soupUI
這是一款提供有開源免費版和企業收費版的軟件。在國外的接口測試中,使用較多。該工具可以支持接口自動化測試和接口性能測試,也支持和 Jenkins 作持續集成測試。瞭解一下就能夠,能夠下載一個社區免費版,作一個 Demo 試試。
5. Java 代碼作接口測試
爲何要用代碼作接口自動化測試呢?一些工具功能是有限制,不少公司須要一些特定的功能,工具不支持,只好用代碼進行開發。通常用 Java 作自動化測試,主要利用 httpclient.jar 包,而後利用 JUnit 或者 TestNG 這樣的單元測試工具,進行測試用例的開發,接着在 Jenkins 上建立一個 job,進行持續集成測試。
6. Python 代碼作接口測試
和 Java 同樣,用 Python 作接口測試,能夠利用一個功能強大的第三方庫 Requests,它能方便地建立接口自動化用例。Python 下的單元測試框架,通常採用unittest。生成測試報告,通常選擇 HTMLTestRunner.py。一樣,能夠結合 Jenkins 作持續集成測試。
7. LoadRunner
不要覺得 LoadRunner 只能作性能測試,它一樣能夠作接口自動化和接口壓力測試。只是咱們不少人,不會利用 LoadRunner 的函數,設計接口測試用例。
8. JMeter
JMeter 同 LoadRunner 同樣,都以性能測試出名,通常用 JMeter 也是作接口性能測試。例如 Java+Jmeter+Ant+Jenkins 作接口性能監聽測試。JMeter 如何作接口測試,能夠查閱官方文檔和 CSDN 博客專欄《JMeter 性能測試》 。
上面說了這麼多工具,基本覆蓋了接口功能測試、接口自動化測試、接口性能測試。這裏提一下,推薦 Python 語言下的一個性能測試工具 Locust。本身百度並安裝下,很簡單的 Web 界面,做爲一個輕量級的協程測試工具,感受很不錯。
服務端測試也應該具有一些計算機基礎知識的能力,例以下面幾個領域的知識。
操做系統和網絡
互聯網裏最大的應用場景就是高併發、高可用、高性能的線上服務,作這類系統實際上考驗的是咱們對操做系統和網絡的理解。任何一個系統最後都是運行在操做系統之上的,也都運行在網絡之上的,包括分佈式系統,因此,須要在操做系統和網絡上必定要有較深的造詣,尤爲是高併發和高性能。
若是對操做系統原理一無所知,基本很難理解什麼是併發和鎖,很難理解高性能用什麼指標來衡量,以及怎麼實現高併發、高可用和高性能。
對於操做系統,咱們必須瞭解 CPU 的多核體系結構、內存分頁和緩存技術、磁盤 IO 的優略和網卡 IO 的狀況,而且要理解計算機的工做原理,會根據這些指標粗略評估服務可以輸出的性能。
對於網絡,必須理解理論上定義的7層模型,瞭解 TCP/IP 的三次握手。另外咱們在分佈式服務架構中多數使用應用層的HTTP協議,因此還須要對 HTTP 協議有很深入的理解。
算法和數據結構
應用層面的小夥伴們可能對算法和數據結構的應用比較少,即便有應用也比較簡單,可是算法能力表明了一我的的邏輯思惟和思考能力,能把各類基礎算法理解的人智商都不會低,可以把程序寫好的人邏輯思惟必定很強。
通常在面試小夥伴的時候,我都會考察一下他會不會高級算法,例如遞歸、剪枝、貪婪、動態規劃。仔細想一下就會知道,會動態規劃的人,他不是勤奮的就是聰明的,不管哪同樣,你都有錄取他的衝動。
線上高併發服務方向
線上高併發服務是個強需求,不管你開發哪類應用和網站,線上服務都是必須的,有了服務纔有了功能,纔有了產品,我也主要從事互聯網後臺高併發服務的設計與實現。
解決高併發服務其實並無那麼難,這些年高併發服務的技術棧也已經沒有了門檻,只要投入足夠的成本,構建可伸縮的服務不是問題,達到多大的 TPS 也都不是問題,核心思想就是「分而治之,大而化下,小而化了」。
咱們使用的緩存抗讀、消息隊列抗寫、數據庫分庫分表、緩存分片、應用層伸縮、減小競爭、7層負載均衡、三四層負載均衡等,以及 CDN、DNS 輪訓等等,這一切都是「分而治之」的思想。
大數據方向
大數據是最近比較火的方向,大小公司都在使用大數據技術。大公司使用大數據分析技術從衆多數據中分析出業務模型,得出有價值的結果,來幫助企業制定市場和銷售策略,中小公司多數使用大數據出報表和作風控等。
全部的大數據技術的根基都來自 Mapreduce、GFS 和 Bigtable 這三篇論文,推薦你們閱讀這些論文:
MapReduce: Simplifed Data Processing on Large Clusters
The Google File System
Bigtable: A Distributed Storage System for Structured Data
理解了這些基礎技術原理,再去學習 Hadoop、HBase、Storm、Spark、Cassandra、MongoDB、ES 等都不是問題。
接口測試經常使用的工具、平臺、框架
自動化測試能夠快速自動完成大量測試用例,節約巨大的人工測試成本;同時須要擁有專業開發技能的人才能完成開發,且須要大量時間進行維護(在需求常常變化的狀況下),因此大部分具備很好開發技能的人員不是很願意編寫自動化用例。但因爲軟件規模的高速增加,人力資源的逐步稀缺,自動化測試已經是勢在必行。
下面是我精選的8個 Java 測試工具和框架。
1. Arquillian
Arquillian 是一個基於 JVM 高度創新性和可擴展的測試平臺,容許 Java 開發人員輕鬆建立自動化集成、功能和驗收測試。Arquillian 容許在運行時間執行測試。能夠用來管理單個或多個容器的生命週期,捆紮測試用例、從屬類和資源。它還可以部署歸檔到容器中,在容器中執行測試、捕獲結果,並建立報告。它集成了常見的測試框架,如 JUnit 四、TestNG 5,並容許使用現有的 IDE 發佈測試,而且因爲模塊化的設計使其可以運行 Ant 和 Maven 測試插件。
2. JTest
JTest 也被稱爲「Parasoft JTest」,是一款由 Parasoft 公司推出的自動化 Java 軟件測試和靜態分析軟件。JTest包含的功能有:單元測試狀況下的生成和執行、靜態代碼分析、數據流的靜態分析、度量分析、迴歸測試、運行時錯誤檢測。此外,它還具有了同行代碼審查流程自動化和運行時錯誤檢測的功能,如競態條件、異常、資源和內存泄漏、安全漏洞攻擊。
3. The Grinder
The Grinder 是一個 Java 負載測試框架,運行簡單,且其分佈式測試採用了許多負載注入機器。只要有 Java API,The Grinder 就能夠進行負載測試。這包括 HTTP Web 服務器、SOAP 和 REST Web 服務器、應用程序服務器,以及用強大的 Jython 和 Clojure 語言寫的包含了自定義協議的測試腳本。
The Grinder 的 GUI 控制檯容許對多個負載注射器進行監測和控制,並自動管理客戶端鏈接和 Cookies、SSL、代理感知和節流鏈接。 The Grinder 在 BSD 風格的開源許可下是免費的。 官方網站:Downloading The Grinder
4. TestNG
TestNG 是一款爲 Java 編程語言設計的測試框架,靈感來自於 JUnit 和 NUnit。TestNG 可覆蓋範圍更廣的測試類型,如單元、功能性、端到端、一體化等。它還有一些新的功能,可使之更強大和更容易使用,如註解、具有大型線程池各類策略的運行測試、多線程的代碼測試、靈活的測試配置、參數化數據驅動的測試支持等等。TestNG 支持各類各樣的工具和插件,好比 Eclipse、IDEA、Maven 等等。
5. JUnit
JUnit 是一個爲 Java 編程語言設計的單元測試框架。JUnit 爲測試驅動開發框架的發展發揮了重要做用。它是如今被統稱爲 xUnit 的單元測試框架你們庭的組成成員之一,源於 SUnit。在編譯時,JUnit 能夠鏈接做爲 JAR,用於編寫可重複的測試。
6. Powermock
PowerMock 是一款支持單元測試源代碼的 Java 框架。雖然 PowerMock 能夠做爲 Mocking 框架,例如做爲 Mockito 和 EasyMock 的擴展而運行,但它還具有更強大的能力。PowerMock 利用自定義的類加載器和字節碼操縱器,來確保靜態方法的模擬、靜態初始化的刪除、函數構造、最終的類和方法以及私有方法。它的主要目的是經過最少的方法和註釋來擴展示有的 API,以得到額外的功能。
7. Cucumber
Cucumber 是 BDD 模式下實現可執行規範(Executable Specifications)的開源工具,可是它的使命並不侷限於作自動化驗收測試,更加劇要的在於其可以在團隊成員之間構建統一的交流基礎(feature 文件)、規範交流用語(Domain Specific Language)、提升各個利益相關方(Business Stakeholders)溝通效率和效果,從而達到提高產品質量、作出客戶指望獲得的產品這一最終目標。
8. Python Unittest
Python 單元測試框架 Unittest,是基於 Java 中流行單元測試框架 JUnit 設計的,其功能強大且靈活,對於熟悉 JUnit 的人來講,掌握 Unittest 很簡單。
Unittest 涉及的知識點較多,但核心的只有一部分,本文將介紹它最核心和基礎的內容。
相似 JUnit,使用 Unittest 編寫 Python 的單元測試代碼,包括以下幾個步驟:
編寫一個 Python 類,繼承 Unittest 模塊中的 TestCase 類,這就是一個測試類。
在上面編寫的測試類中定義測試方法(這個就是指的測試用例),每一個方法的方法名要求以 test 打頭,沒有額外的參數。在該測試方法中調用被測試代碼,校驗測試結果,TestCase 類中提供了不少標準的校驗方法,如最多見的 assertEqual。
執行 unittest.main() ,該函數會負責運行測試,它會實例化全部 TestCase 的子類,並運行其中全部以 test 打頭的方法。
如下是Python Unittest 測試用例執行的關係圖。
咱們下面看一些例子,編寫以下的 Python文件。
(1)手工加載批量用例。
import unittestclass TestOne(unittest.TestCase): def setUp(self): print '\ncases before' pass def test_add(self): '''test add method''' print 'add...' a = 3 + 4 b = 7 self.assertEqual(a, b) def test_sub(self): '''test sub method''' print 'sub...' a = 10 - 5 b = 5 self.assertEqual(a, b) def tearDown(self): print 'case after' passif __name__ == '__main__': # 一、構造用例集 suite = unittest.TestSuite() # 二、執行順序是安加載順序:先執行test_sub,再執行test_add suite.addTest(TestOne("test_sub")) suite.addTest(TestOne("test_add")) # 三、實例化runner類 runner = unittest.TextTestRunner() # 四、執行測試 runner.run(suite)
(2)自動加載批量用例。
import unittestimport osclass TestOne(unittest.TestCase): def setUp(self): print '\ncases before' pass def test_add(self): '''test add method''' print 'add...' a = 3 + 4 b = 7 self.assertEqual(a, b) def test_sub(self): '''test sub method''' print 'sub...' a = 10 - 5 b = 5 self.assertEqual(a, b) def tearDown(self): print 'case after' passif __name__ == '__main__': # 一、設置待執行用例的目錄 test_dir = os.path.join(os.getcwd()) # 二、自動搜索指定目錄下的cas,構造測試集,執行順序是命名順序:先執行test_add,再執行test_sub discover = unittest.defaultTestLoader.discover(test_dir, pattern='test_*.py') # 實例化TextTestRunner類 runner = unittest.TextTestRunner() # 使用run()方法運行測試套件(即運行測試套件中的全部用例) runner.run(discover)
接口測試的一些問題和實踐
以 TestNG 爲例,它是一套根據 JUnit 和 NUnit 思想而構建的利用註釋來強化測試功能的一個測試框架。TestNG 設計涵蓋全部類型的測試,如單元、功能、端到端、集成等。學習 TestNG 以前須要先學習編程語言 Java、配置本地 JDK 環境(JDK1.5 版本或以上)和安裝 Java 開發工具 Eclipse。
接下來,咱們一塊兒來學習 TestNG。
1. 在 Eclipse 中安裝 TestNG。
打開 Eclipse Help -> MarketPlace,在搜索框裏面輸入 TestNG 搜索,而後安裝 TestNG 插件。
2. 安裝成功後,在項目的 package 上右鍵能夠看到 TestNG -> Create TestNG class。
這裏能夠勾選 TestNG 的註解方法,主要註解方式有:
@BeforeSuite:被此註解的方法將在全部測試運行以前運行該方法。
@AfterSuite:被此註解的方法將在全部測試運行以後運行該方法。
@BeforeTest:被此註解的方法,將在測試運行以前運行。
@AfterTest:被此註解的方法,將在測試運行以後運行。
@BeforeClass:被此註解的方法,將在當前類的第一個測試方法調用以前運行。
@AfterClass:被此註解的方法,將在當前類的全部測試方法調用以後運行。
@BeforeMethod:被此註解的方法,將在每一個測試方法調用以前運行。
@AfterMethod:被此註解的方法,將在每一個測試方法調用以後運行。
@DataProvider:標誌着一個方法,提供數據的一個測試方法。
至此環境搭建完成,能夠開始寫測試的 case 了。
3. 從一個簡單的測試 case 開始入手,代碼以下:
package com.pingan.ff.zijin;import org.testng.annotations.Test;import org.testng.annotations.DataProvider;import org.testng.annotations.BeforeTest;import org.testng.annotations.AfterTest;public class NewTest { @Test(dataProvider = "dp") public void f(Integer n, String s) { System.out.println("第一個參數是"+n+",第二個參數是"+s); } @DataProvider public Object[][] dp() { return new Object[][] { new Object[] { 1, "a" }, new Object[] { 2, "b" }, }; } @BeforeTest public void beforeTest() { System.out.println("------------開始測試------------"); } @AfterTest public void afterTest() { System.out.println("------------結束測試------------"); } }
右鍵 Run As -> TestNG Test,運行後結果以下圖所示。
從測試的結果能夠看到執行的順序是 beforeTest() -> Test() -> afterTest(),同時 Test() 方法從 dataProvider dp 裏面接收參數。以下圖所示。
轉自公衆號:CSDN技術頭條
做者:SoftwareLuke
連接地址:https://mp.weixin.qq.com/s?__biz=MzA4Mzc0NjkwNA==&mid=2650784584&idx=1&sn=934fbedff493e622671ef93f6f97cc46&chksm=87faaa7fb08d2369822f988cf8080f285cf2abc50524c9662d96b71140617e3235ae9955adae&mpshare=1&scene=23&srcid=0327GWQGY3J7WLUuOrAOVaHC%23rd