Dokcer分享-Dockertest
测试一直是开发不可缺少的一部分,docker官网介绍了如何跑一些简单的测试,来测试你刚刚部署的程序。
我还发现了一个很神奇的事情,我发现,docker这部分,官网中java,和go都是带测试的,唯独python没有,有兴趣你们可以看看放上链接。https://docs.docker.com/language/golang/run-tests/
func TestRespondsWithLove(t *testing.T) {
pool, err := dockertest.NewPool("")
require.NoError(t, err, "could not connect to Docker")
resource, err := pool.Run("docker-gs-ping", "latest", []string{})
require.NoError(t, err, "could not start container")
t.Cleanup(func() {
require.NoError(t, pool.Purge(resource), "failed to remove container")
})
var resp *http.Response
err = pool.Retry(func() error {
resp, err = http.Get(fmt.Sprint("http://localhost:", resource.GetPort("8080/tcp"), "/"))
if err != nil {
t.Log("container not ready, waiting...")
return err
}
return nil
})
require.NoError(t, err, "HTTP error")
defer resp.Body.Close()
require.Equal(t, http.StatusOK, resp.StatusCode, "HTTP status code")
body, err := io.ReadAll(resp.Body)
require.NoError(t, err, "failed to read HTTP body")
// Finally, test the business requirement!
require.Contains(t, string(body), "<3", "does not respond with love?")
}
测试应用程序还有许多不同的方法,这个例子只有高级的功能,应用层测试,之后还有自动化管道。
测试使用了ory/dockertest Go模块
主要是想分享为什么要用Dockertest?
当我们在开发的时候,大多数的服务都需要应用的数据库,所以与数据库服务进行单元测试就会很麻烦,要耗费额外的精力,可能要去模拟数据库,找一些假数据来测试,有时候可能因为一些小的更改就需要重写一些模拟function。为了避免这种情况,可以用真实的数据库去测试这些特定的服务,这就需要对容器有一个很好的控制,docker是运行单元测试的完美系统,因为他可以在几秒钟内启动容器,在测试完成时终止他们。Dockertest库久提供了非常好用的命令来启动Docker容器,并应用于测试当中。
网友评论