像往常一样对Docker容器或dockerize测试运行测试?

时间:2015-07-03 00:57:33

标签: unit-testing testing docker continuous-integration

我是Docker的新手,正在阅读Docker。这是一种在自包含且可重现的标准化配置中测试系统的好方法(正确完成时)。

然而,在我读过的所有内容中,似乎并没有过分强调如何使用docker容器进行测试。码头工具用于"包含"用于轻松测试(以及部署)的基础架构和应用程序(代码)。但有时测试代码库很大,也不是那么简单。一个人可以拥有用于API测试的测试代码库,另一个用于UI等等。

测试Docker容器/部署应用程序/基础架构的标准做法是什么或应该(在某些时候确定)?应:

  • 测试代码以旧的传统方式部署,作为文件存储库从某处运行,然后在Jenkins服务器/从服务器或本地主机上运行以进行dev / QA测试/调试,测试针对的是应用程序docker container?
  • 将整个测试代码库作为自包含容器进行dockerize,然后使用该容器针对具有应用程序代码/系统基础结构的其他容器启动/执行测试?
  • 将测试作为各个docker容器本身的一部分进行组合,以便在需要时运行。但我认为这最适合仅与容纳匹配应用程序代码的容器配对的单元测试。集成,UI,系统级测试与系统中的应用程序模块相关联。

我能想到的唯一原因是使dockerizing测试可能有用,它是一个单独的容器,包含您需要的所有测试和匹配的测试基础架构(所有测试平台/语言依赖项),以便可以部署并在匹配的应用程序代码容器中随处运行测试。从/根据需要保存必须设置测试基础设施。但是似乎没有博客关于这种针对码头化测试的博客。

3 个答案:

答案 0 :(得分:4)

我更喜欢您的选项(3),即在生产可部署工件(docker image)中包含测试代码

引用Alister Scott来自我参加的GTAC 2015

  

不要害怕为您的应用添加可验证性特定功能,而这些功能不起作用。我最近不得不在我的车上买到新轮胎,并意识到很多轮胎都具有称为胎面指示器的可测试性功能。这些不起作用

对于集成和e2e测试,即需要使用多于1个docker镜像的测试,我更喜欢CI tool,通过docker-compose和单独的git repo进行这些测试,协调创建大型测试所需的所有容器。 Docker图像再次使用should be the exact same as for production除了what varies is the configuration(例如环境变量),使测试指向测试数据和/或登台服务。

答案 1 :(得分:2)

我认为您不会将测试本身作为运行测试的过程进行停靠。

例如,如果您需要在php中使用phpunit运行单元测试,您可以使用phpunit对其进行停靠,并使用它来对您的代码运行测试,对于您使用的任何其他测试框架也是如此(例如,testng,junit。 ..等等。)

这是我用来封装Java测试项目的Java / Maven / TestNG的Dockerfile示例,其中包括一些selenium测试:

FROM maven:3-jdk-8

# Selectively add stuff we need
COPY pom.xml /usr/src/testng/

# Get a clean build immediately after and 'go-offline' to improve subsequent builds
RUN cd /usr/src/testng && mvn dependency:go-offline
COPY src /usr/src/testng/src
WORKDIR /usr/src/testng/

# Additional support files that's needed but not for the build
COPY supportfiles /usr/src/testng/supportfiles

CMD [ "mvn test" ]

答案 2 :(得分:0)

仔细查看我在此页面上提供的屏幕截图:https://github.com/djangofan/karate-test-prime-example这是我制作的一个示例项目,该示例项目展示了如何在具有服务的上下文中进行测试容器并在测试结束时返回退出代码

然后,当管道释放代码时,在其上线之前,您的Docker容器将包含退出代码,该退出代码使您的管道可以决定是否回滚它。