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容器,并应用于测试当中。