OpenIM E2E Test 设计

首先看一下 Go 语言有两个很有名的 seleniumopen in new window

  • https://github.com/aerokube/selenoid
  • https://github.com/tebeka/selenium

OpenIM 端到端(End-to-End,E2E)测试设计是一个多步骤的过程,其中包括规划、编写测试用例、自动化测试脚本,以及监控和维护测试环境。在设计 E2E 测试时,考虑到使用 Go 语言,我们可以使用 selenoidtebeka/selenium 这两个有名的 Selenium 工具。以下是一个基于这些工具的 E2E 测试设计的概要步骤:

确定步骤

1. 确定测试范围

  • 确定哪些功能需要 E2E 测试。参考 https://docs.google.com/spreadsheets/d/1zELWkwxgOOZ7u5pmYCqqaFnvZy2SVajv/edit?usp=drive_link&ouid=103266350914914783293&rtpof=true&sd=true
  • 确定测试环境的需求,例如不同的操作系统、浏览器版本等。

2. 测试规划

  • 定义测试目标和目的。
  • 设定测试时间表。
  • 确定资源分配(如人员、服务器等)。

3. 选择工具

  • selenoid 是一个 Selenium hub 的实现,用于在容器中运行浏览器,可以更容易地部署和伸缩。
  • tebeka/selenium 是一个 Go 语言客户端,用于和 Selenium WebDriver 交互。

4. 设置测试环境

  • 使用 Docker 安装并运行 selenoid 或配置本地/远程 WebDriver 服务。
  • 确保所有依赖的服务和数据均已就绪。

5. 编写测试用例

  • 根据功能需求,编写详细的测试用例。
  • 为每个测试用例定义预期的结果。

6. 自动化测试脚本

  • 使用 tebeka/selenium 编写测试脚本来自动化浏览器操作。
  • 使用 selenoid 进行浏览器的管理和日志收集。
  • 实现数据驱动的测试来处理多个测试数据集。

7. 执行测试

  • 运行自动化测试脚本。
  • 收集测试结果和日志。

8. 结果分析和报告

  • 分析测试结果,查找失败的原因。
  • 编写测试报告,包括成功率、性能问题等。

9. 维护和迭代

  • 根据测试反馈优化测试用例和脚本。
  • 定期更新测试环境和测试数据。

小试牛刀

在使用这些工具时,你需要熟悉 Go 语言以及与 WebDriver 交互的方式。Selenoid 和 tebeka/selenium 两者可以配合使用,

  • Selenoid 管理和运行浏览器实例
  • tebeka/selenium 可用于编写 Go 语言中的测试脚本。

以下是一个使用 tebeka/selenium 的示例 Go 代码片段,用于演示如何启动一个浏览器会话,打开一个页面,并进行简单的操作:

package main

import (
    "fmt"
    "time"
    "github.com/tebeka/selenium"
)

func main() {
    // Start a Selenium WebDriver server instance (if one is not already running).
    const (
        seleniumPath    = "path/to/selenium-server-standalone.jar"
        geckoDriverPath = "path/to/geckodriver"
        port            = 4444
    )
    opts := []selenium.ServiceOption{
        selenium.GeckoDriver(geckoDriverPath), // Specify the path to GeckoDriver in order to use Firefox.
        selenium.Output(nil),                   // Output debug information to STDERR.
    }
    selenium.SetDebug(true)
    service, err := selenium.NewSeleniumService(seleniumPath, port, opts...)
    if err != nil {
        panic(err) // Simplified error handling for the example
    }
    defer service.Stop()

    // Connect to the WebDriver instance running locally.
    caps := selenium.Capabilities{"browserName": "firefox"}
    wd, err := selenium.NewRemote(caps, fmt.Sprintf("http://localhost:%d/wd/hub", port))
    if err != nil {
        panic(err)
    }
    defer wd.Quit()

    // Set a timeout for the Find operation.
    wd.SetImplicitWaitTimeout(time.Second * 10)

    // Navigate to the desired website.
    err = wd.Get("https://www.example.com")
    if err != nil {
        panic(err)
    }

    // Find an element by its name and send a value to it.
    elem, err := wd.FindElement(selenium.ByName, "q")
    if err != nil {
        panic(err)
    }
    err = elem.SendKeys("selenium user")
    if err != nil {
        panic(err)
    }

    // Click on the element.
    btn, err := wd.FindElement(selenium.ByCSSSelector, "input[type='submit']")
    if err != nil {
        panic(err)
    }
    err = btn.Click()
    if err != nil {
        panic(err)
    }

    // Wait for a specific element to be found in the DOM.
    cond := selenium.Condition(func(wd selenium.WebDriver) (bool, error) {
        _, err := wd.FindElement(selenium.ByID, "resultStats")
        return err == nil, err
    })
    wd.WaitWithTimeoutAndInterval(cond, 30*time.Second, 500*time.Millisecond)

    // Take a screenshot of the current page.
    screenshot, err := wd.Screenshot()
    if err != nil {
        panic(err)
    }

    // ...Save or process the screenshot.

    // Close the current window.
    err = wd.Close()
    if err != nil {
        panic(err)
    }

    // Finish the session.
    err = wd.Quit()
    if err != nil {
        panic(err)
    }
}

有三个项目, openim-server 是服务端,启动的 API 和 各个 RPC 组件。

其中包括如下组件:

openim-api
openim-cmdutils
openim-crontask
openim-msggateway
openim-msgtransfer
openim-push
openim-rpc-auth
openim-rpc-conversation
openim-rpc-friend
openim-rpc-group
openim-rpc-msg
openim-rpc-third
openim-rpc-user

openim-chat 是 server 的业务服务器,包括两个 API 和 两个 rpc ,包括登录注册等逻辑

openim-web 是 网页 端,有登录注册,以及收发信息等等。

我想为 openim-server 设计 E2E ,请问该怎么设计