📌  相关文章
📜  golang http 测试 - Go 编程语言(1)

📅  最后修改于: 2023-12-03 14:41:33.334000             🧑  作者: Mango

#golang http 测试

##介绍 HTTP是现代Web应用程序中不可或缺的一部分。 Go语言拥有强大的Http包支持,我们可以方便的创建RESTful API或者Web Server。

在本篇文章中,我们将学习如何使用Go进行HTTP测试。 通过学习这些测试的例子,我们可以确保我们的Web应用程序可以正常地运行,以及在修改应用程序代码后,可以确保应用程序仍然像之前一样正确地工作。

##项目结构 以下是本项目的目录结构:

go-http-test/
	-controller/
		router.go
	-model/
		user.go
	-test/
		-testmain.go
		-controller_test.go
	-model_test.go
	-main.go
  • controller/main.go负责路由。
  • model/user.go负责与数据库相关的业务逻辑。
  • test/ 是我们测试代码的存储位置。
go get github.com/stretchr/testify/

我们将使用测试库“testify”来完成这些测试。testify是一个Go测试工具集,可与Go的标准测试软件包一起使用,提供一组有用的断言功能。可以使用“go get”命令获取testify。

##编写测试 我们着眼于编写测试代码,首先我们先定义我们的测试用例。在本篇文章中,我们将测试以下内容:

  • 正确路由处理和正确响应
  • User模型的相关业务逻辑

函数测试 我们从一个最简单的HTTP请求开始。 测试我们的/users路由是否可用:

// controller_test.go
package controller

import (
	"net/http"
	"net/http/httptest"
	"testing"
)

func TestUserRoute(t *testing.T) {
	req, err := http.NewRequest("GET", "/users", nil)
	if err != nil {
		t.Fatal(err)
	}

	rr := httptest.NewRecorder()
	handler := http.HandlerFunc(user)

	handler.ServeHTTP(rr, req)

	if status := rr.Code; status != http.StatusOK {
		t.Errorf("handler returned wrong status code: got %v expected %v",
			status, http.StatusOK)
	}

	expected := `{"message":"success"}`
	if rr.Body.String() != expected {
		t.Errorf("handler returned unexpected body: got %v expected %v",
			rr.Body.String(), expected)
	}
}

这个测试用例的目的是检查我们是否能成功获取到正确的HTTP响应,以及返回正确的信息。

我们使用http.NewRequest函数,模拟了一个GET请求,借助httptest.NewRecorder函数,创建一个用于编写响应的Response记录器。然后创建了路由处理程序,调用ServeHTTP函数进行处理。最后,我们检查返回的HTTP响应中是否包含正确的状态代码和预期的响应。

Model测试 下面我们来测试model/user.go文件中的代码。 首先,我们先来看一下user.go中的代码实现。

在这个文件中,我们定义了三个用户,以及一个对它们进行操作的结构。

现在,我们将编写测试用例,测试以下内容

1.是否成功创建了用户 2.是否可以通过ID获取用户

// model_test.go
package model

import (
	"testing"

	"github.com/stretchr/testify/assert"
)

func TestAddUser(t *testing.T) {
	err := AddUser(User{
		Name:  "Sarah",
		Email: "sarah@gmail.com",
		ID:    "12345",
	})
	assert.NoError(t, err)
}

func TestGetUserByID(t *testing.T) {
	user, err := GetUserByID("12345")
	assert.NoError(t, err)
	assert.EqualValues(t, "Sarah", user.Name)
}

使用testify断言函数,我们可以使用assert.EqualValues断言函数来比较两个字符串或数字是否相等。 我们还可以使用assert.NoError来确保在执行操作时没有出现错误。

##结论 现在您已经拥有了一些GoHTTP测试的基础知识,我们在路由和依赖项之间分离代码,以便更轻松地进行测试。通过添加测试用例并运行测试,我们可以确保我们的Web应用程序总是可以正常运行并且我们所预期的行为正确无误,以及确保在更改代码时不会引入任何错误。

完整示例代码可以在我们的GitHub存储库中找到: https://github.com/YourGitHubID/go-http-test