互聯網服務端接口自動化是各個公司都需要一部分業務,如何快速高效地完成接口測試呢?
以幫助大家實現高效的接口測試為出發點,本文包含了我在互聯網接口測試領域的一些方法和心得,希望大家一起討論和分享,內容包括但不僅限於:
-
互聯網服務端接口測試介紹;
-
接口測試常用的工具、平台、框架;
-
接口測試的一些問題和實踐。
下圖是經典的測試金字塔,服務接口測試在中部,承上啟下,由此可見其重要性。
互聯網服務端接口測試介紹
目前市場上有很多支持接口測試的工具,能夠提高測試效率。但是讓你一天完成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 4、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__': # 1、構造用例集 suite = unittest.TestSuite() # 2、執行順序是安加載順序:先執行test_sub,再執行test_add suite.addTest(TestOne("test_sub")) suite.addTest(TestOne("test_add")) # 3、實例化runner類 runner = unittest.TextTestRunner() # 4、執行測試 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__': # 1、設置待執行用例的目錄 test_dir = os.path.join(os.getcwd()) # 2、自動搜索指定目錄下的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