自動化運維:使用Maven與Docker執行Selenium測試

2023-02-09 06:03:40

在這篇文章中,我們將向您展示如何建立交付流水線並實現以下目標:

  • 使用Web應用程式構建Docker映象
  • 在Docker容器中執行該應用程式
  • 從不同的容器中使用Maven執行Selenium測試

出於本文演示目的,我們將使用託管在GitHub上的Java範例專案: github.com/buddy-red/node-maven-selenium-tests進行演示。

流水線流程

每次更改儲存倉時,流水線將執行以下任務:

  1. 構建Web應用程式的Docker映象
  2. 執行3個Docker容器:
  • 上一個操作中生成映象的容器
  • Selenium伺服器容器
  • 帶有將執行測試的Maven容器
  1. 根據測試,流水線將給出以下兩個結果:
  • [測試通過] 推播映象至Docker註冊中心 & 執行映象於伺服器
  • [測試失敗] 通過Slack給團隊傳送通知


流水線設定

首先,我們需要在GitHub原始碼儲存倉庫中對Buddy系統進行帳戶身份驗證:

接下來,我們新添一條流水線,並將其設定為在每次推播到主分支時自動執行:

操作

我們指定了流水線的目標分支和觸發條件,是時候新增將執行任務的操作了。

構建Docker映象

在操作列表中Docker部分找到如下圖的構建映象

定義Dockerfile和相關聯環境(如果它與包含Dockerfile的目錄不同)。在本例中是front:

使用Maven設定Selenium測試

隨著Docker映象的構建和等待,我們需要一個操作來執行測試。在構建工具 & 任務執行部分找到Maven操作或者在搜尋方塊中直接搜尋Maven:

輸入將執行測試的命令,例如:mvn clean install :

現在,我們需要在服務分頁中新增兩個微服務,這些本質上是附加並連結到主構建容器的Docker容器。

  1. 第一個應該是適用於您的瀏覽器型別的Selenium服務。在這個例子中,我們將使用Selenium Chrome:

  1. 現在,單擊+加號按鈕附加另一個,然後選擇Custom自定義服務。將其設定為使用我們在上一步中構建的Docker容器:

確保設定應用程式將在其上執行的埠(本例為80)。這樣在應用程式成功啟動之前,Maven不會啟動測試。

設定Selenium

設定後,該操作將執行3個相互連結的容器:Maven、Selenium和一個自定義容器。為使其工作,我們需要設定測試將連線到的Selenium伺服器以及將要執行的應用程式的地址。

在我們的應用程式中,分別在第23、30和第38行進行定義。主機名應映現在Maven操作服務中輸入的主機名:

package works.buddy.test;

import org.junit.Before;
import org.junit.After;
import org.junit.Test;
import org.junit.Ignore;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

import static org.junit.Assert.*;
import java.net.URL;
import java.net.MalformedURLException;
import java.util.concurrent.TimeUnit;

public class SeleniumTest {

    private WebDriver driver;

    @Before
    public void setUp() throws MalformedURLException {
        DesiredCapabilities capability = DesiredCapabilities.chrome();
        driver = new RemoteWebDriver(new URL("http://selenium-ch:4444/wd/hub"), capability);
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
    }

    @Test
    public void test1() throws Exception {
      driver.get("http://myapp.com");
        assertEquals("大家好!", driver.getTitle());
    }

  //Error
  @Ignore
    @Test
    public void test2() throws Exception {
      driver.get("http://myapp.com");
        assertEquals("Hello 木日夏復!", driver.getTitle());
    }

    @After
    public void tearDown() {
      driver.quit();
    }

}

主機名hostname主機名等變數可以在流水線中定義為環境變數。如果變數在執行時未解析,則可以使用查詢 & 替換操作來交換其值。

推播Docker映象至註冊中心

如果所有測試都已成功通過,則可以將映象推播到Docker註冊中心:

Buddy與Docker Hub、Amazon ECR和Google GCR進行了原生整合。您還可以將映象推播到您自己的私有註冊中心:

您可以在我們的檔案中找到有關構建推播Docker映象的更多資訊!

釋出應用

映象儲存在登入檔中並準備在伺服器上釋出。使用Buddy,您可以將其部署到Kubernetes、Amazon EKS 或Azure AKS叢集,或者您可以在自己的伺服器上執行docker-compose

相關K8s的更多資訊,請檢視關於Kubernetes叢集上的容器編排指南。

傳送通知

讓您的團隊知道測試失敗,或者您的客戶知道新版本正在等待審批,這些是任何軟體開發業務的關鍵,基礎上是一個持續構建 - 測試-釋出運維。Buddy原生地與最流行的通知服務整合,包括Slack,Discord和Telegram:

可以新增兩個包含不同訊息的通知:一個在主要部分中表示已成功完成的操作,另一個在測試或部署失敗時傳送於失敗部分。這樣,您就可以隨時通知QA團隊,保持資訊與狀態暢通。