1. 程式人生 > >網際網路服務端介面自動化測試

網際網路服務端介面自動化測試

在飛速發展的網際網路時代,服務端測試已經成為一個重要的產品保障手段。如何在網際網路公司提供穩定的服務端介面測試,各個公司實施的方法和技術也不同,今天我們就此展開討論學習。

網際網路服務端介面自動化是各個公司都需要的一部分業務,如何快速高效地完成介面測試呢?以幫助大家實現高效的介面測試為出發點,本場 Chat 包含了我在網際網路介面測試領域的一些方法和心得,希望大家一起討論和分享,內容包括但不僅限於:

  • 網際網路服務端介面測試介紹;
  • 介面測試常用的工具、平臺、框架;
  • 介面測試的一些問題和實踐。

下圖是經典的測試金字塔,服務介面測試就在中間位置,並佔據著承上啟下的作用,從這個圖可以看出,服務服務端介面測試的重要性。

enter image description here

網際網路服務端介面測試介紹

目前市場上有很多支援介面測試的工具。利用工具進行介面測試,能夠提高測試效率。例如讓你一天完成100個介面測試任務,你覺得你加班能否完成嗎?你可能會說有工具可以幫忙呀,但不是所有工具都能支援你完成這個任務。下圖是我挑選的幾款工具,接下來對它們簡單介紹一下。

enter image description here

1.fiddler

首先,這是一個 HTTP 協議除錯代理工具,說白了就是一個抓 HTTP 包的工具。Web 測試和手機測試都能用到這個工具。既然是 HTTP 協議,這個工具也能支援介面測試。稍後文章,我們會專門介紹 fiddler 這個工具。

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 這三篇論文,推薦大家閱讀這些論文:

理解了這些基礎技術原理,再去學習 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 的單元測試程式碼,包括如下幾個步驟:

  1. 編寫一個 Python 類,繼承 Unittest 模組中的 TestCase 類,這就是一個測試類。
  2. 在上面編寫的測試類中定義測試方法(這個就是指的測試用例),每個方法的方法名要求以 test 打頭,沒有額外的引數。在該測試方法中呼叫被測試程式碼,校驗測試結果,TestCase 類中提供了很多標準的校驗方法,如最常見的 assertEqual。
  3. 執行 unittest.main() ,該函式會負責執行測試,它會例項化所有 TestCase 的子類,並執行其中所有以 test 打頭的方法。

以下是Python Unittest 測試用例執行的關係圖。

enter image description here

我們下面看一些例子,編寫如下的 Python檔案。

(1)手工載入批量用例。

import unittest

class 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'
        pass

if __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 unittest
import os

class 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'
        pass

if __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 裡面接收引數。如下圖所示。

enter image description here

4.TestNG 預設情況下,會生成兩種型別的測試報告 HTML 和 XML,測試報告位於 test-output 目錄下。右鍵專案重新整理一下專案就可以看到。

用瀏覽器開啟 /test-output/Default suite/Default test.html 可以看到如下圖的測試報告。

enter image description here

以 Pythonunit 為例,測試報告如下。enter image description here

相關推薦

網際網路服務介面自動化測試

在飛速發展的網際網路時代,服務端測試已經成為一個重要的產品保障手段。如何在網際網路公司提供穩定的服務端介面測試,各個公司實施的方法和技術也不同,今天我們就此展開討論學習。網際網路服務端介面自動化是各個公司都需要的一部分業務,如何快速高效地完成介面測試呢?以幫助大家實現高效的介

基於 Jmeter 的 web 介面自動化測試平臺

簡介 基於之前的react+unittest+flask的介面自動化平臺開發經驗,和趟過的坑,我重新開發了這個介面自動化平臺。平臺前端採用的antd+dva+umi的antd-pro模板,結合平臺業務設計開發。後端採用的flask+sqlalchemy+Blueprint,結構化更加清晰,ORM

Dubbo介面自動化測試(一)--直連服務提供者

在做測試環境Dubbo介面測試的過程中,通過點對點的方式直連provider是非常方便的,點對點的意思就是我們跳過zookeeper註冊中心,直接連線服務並消費。因為服務正常啟動的情況下,我們只需要寫consumer即可。 consumer.xml檔案如下

服務性能測試 TPS

不同 基本 系統負載 時間設置 負載 衡量 nbsp bsp 處理 針對服務器端的性能,以TPS為主來衡量系統的性能,並發用戶數為輔來衡量系統的性能,如果必須要用並發用戶數來衡量的話,需要一個前提,那就是交易在多長時間內完成,因為在系統負載不高的情況下,將思考時間(思考時

【JMeter4.0學習(三)】之SoapUI創建WebService接口模擬服務以及JMeter測試SOAP協議性能測試腳本開發

test 點擊 下一步 download enc text div 接口模擬 wid 目錄: 創建WebService接口模擬服務端 下載SoapUI 新建MathUtil.wsdl文件 創建一個SOAP項目 接口模擬服務端配置以及啟動 【闡

HttpClient請求服務介面資料Get與Post請求

public static void main(String[] args) { //String url = "http://10.3.1.32/proxy_services/MDMConsumerProxyService"; String url = "http

Java介面自動化測試之「Mock介面平臺」,讓你的自動化更提前

前言:目前Mock技術已經比較成熟,在日常的工作中Mock也可以給我們帶來很大的遍歷,本篇文章將會使用Moco框架,一步一步搭建一套Mock Server,使得介面的自動化測試更加的提前,也能夠使得前後端分離。 共識與痛點 目前,在軟體行業內,大家已經達成的共識就是,測試

使用jmeter+ant+jenkins實現介面自動化測試

本次使用linux環境搭建自動化框架 配置ANT  首先下載Ant壓縮包,下載地址https://ant.apache.org/bindownload.cgi 解壓下載的ant包,然後複製jmeter/extras下的ant-jmeter-1.1.1.jar檔案放到ant的lib目錄 然後對該檔

通用JS工具類封裝——網路資料請求功能、獲取服務介面 url、引數功能

程式碼片段 'use strict'; var conf = { serverHost = '' }; var _mm = { //網路請求功能 request : function(param){ var _this = this;

Jmeter+Ant+Jenkins介面自動化測試框架搭建for Windows

前言 軟體開發的V模型大家都不陌生,其中測試階段分為單元測試→功能測試→系統測試→驗收測試。其中單元測試一般由開發同學們自己完成,大部分測試具體實施(這裡不包括用例設計)是從單體功能測試開始著手的。 如果測試一個功能,發現主流程無法走下去,也就是介面不通,這時再打回去開發手裡繼續改,改

介面自動化測試框架開發 (pytest+allure+aiohttp+ 用例自動生成)

近期準備優先做介面測試的覆蓋,為此需要開發一個測試框架,經過思考,這次依然想做點兒不一樣的東西。 介面測試是比較講究效率的,測試人員會希望很快能得到結果反饋,然而介面的數量一般都很多,而且會越來越多,所以提高執行效率很有必要 介面測試的用例其實也可以用來兼做簡單的壓力測試,而壓力測

移動Appium自動化測試框架的優勢

眾所周知,現在市面上的移動端作業系統已被Android和IOS佔領,其中Android的份額更是在80%以上。那麼面對市面上林林總總的自動化測試框架和工具,為什麼說Appium在自動化測試框架的統治級優勢呢,下面先看一下各大主流框架的對比及優勢。  一、主流框架對比   下面對比了市面上主流

超簡單兩招搞定JSON介面自動化測試(RESTful API)

純文字協議模板構造JSON請求 上一個版本釋出後,有一些同學反饋,舊版的協議模板( 表單模式)使用 ,在測試restfull 介面(json格式)的時候,還是有一些懵,不知道怎麼下手,感覺沒有其他工具直接複製一個純檔案JSON來得直接跟方便。  

HttpRunnerManager介面自動化測試框架在win環境下搭建教程

    近幾日一直在研究如何把介面自動化做的順暢,目前用的是輕量級jmeter+ant+Jenkins自動化測試框架,目前測試界的主流是python語言,所以一直想用搭建一個基於python的HttpRunnerManager。公司專案也比較多,在上班的過程中偶爾研究了一下,於是就利用週末,在家操作

阿里App支付服務介面開發(含後臺非同步回撥,退款)

1.引入相關包檔案 maven匯入方式: <dependency> <groupId>com.alipay</groupId> <artifactId>sdk-java</artifactId> <version>

使用jmeter+maven+jenkins實現restful介面自動化測試

一、環境搭建 安裝 jdk、eclipse、git Jdk下載路徑:http://rj.baidu.com/soft/detail/14459.html?ald Eclipse線上安裝包下載地址:http://www.eclipse.org/downl

【規範建議】服務介面返回欄位型別與iOS的解析

一、本文件的寫作目的   App需要跟產品、UI、後臺、伺服器、測試打交道,app的產出是其他端人員產出的綜合體現。與其他端人員溝通就像是開發寫介面,也就是面向介面程式設計的思想。   本文件講解針對的是服務端返回資料時使用的欄位資料型別如何選擇、iOS端將JSON資料轉模型的時候用什麼型別來定義對應的屬

python--utp介面自動化測試框架

測試套件:testsuite  多個用例放在一起 unittest  1、函式名必須是test開頭,unittest才會幫你執行               2、用例執行的順序是按照函式的首字母排序的,a-z te

react+unittest+flask 介面自動化測試平臺

1 前言 介面自動化測試的工具很多,比如soapUI,postman,jmeter等等,但是這些通用的工具的可擴充套件性以及跟專案的契合度上並不是十分合適。 單有框架,還不足以讓介面自動化更簡化,自動化測試需要大量編碼維護工作,為了改善這些問題,解放重複的勞動力,所以將其做成平臺型的,可以讓不懂技術的人都

python介面自動化測試框架(post提交新增變數)

1、python介面測試框架包含哪幾部分 資料來源-> GET/POST 傳送請求->接收返回結果->斷言測試結果->生成測試報告(html報告)->網頁報告   2、python介面測試框架 config:存放配置檔案,比如資料庫設定、郵件配置、log配置