我们有一个由许多程序和脚本组成的数据采集系统,它们在不同的机器上一起运行,有些是顺序运行的,大多数是并行运行的。
我们使用Jenkins构建和运行单元测试。
我们现在要通过使用数据生成器作为系统的输入并检查数据采集链的输出来测试整个系统。
测试系统步骤的简化视图:
- 恢复系统(数据库、存储库中的包、重新启动虚拟机)
- 根据需要配置系统(写入要使用的配置文件,更新数据库)
- 启动所需的几个父进程并等待它们准备好
- 开始数据输入
- 一旦完成,收集指标和结果,与预期结果进行比较,检查日志中的错误消息,…
理想情况下,我们应该在不同的配置和输入下运行它。
你会用什么工具来做这件事?还是直接在jenkins中做?
你没有告诉我们足够的关于你的设置,我们无法给你具体的答案。这很大程度上取决于你使用的语言/环境。您可能需要以下一个或多个选项的组合:
- Vagrant/Chef或Puppet/Veewee/VirtualBox自动构建虚拟机并配置和运行。这是假设Linux平台。Chef + Linux容器要快得多,特别是如果您在ram磁盘上运行它(它应该是一个可重复的过程,因此只需要存储工件)
- 为所有需要安装在vm上的系统包提供版本控制的包缓存
- 运行验收测试的框架,Cucumber, Robot之类的。如果您的单元测试很好,那么您可以使用冒烟测试。
- 系统的模拟,您可以从日志中提供运行时结果,以便您知道如何以及何时扩展。
您很可能遇到测试缓慢的问题,因为您必须填充数据库,并且可能必须分割测试作业。一般来说,让这个工作的反馈循环太慢了,你可能需要非常有创意才能得到一个可接受的周期时间。
在不同的环境中,有不同的工具来实现这一点,拥有多个堆栈并不是很有趣。Jenkins运行在Java栈上,Puppet;Chef在Ruby堆栈上,Python也有类似的工具,c &perl堆栈。您必须自己决定,是希望拥有一流的集成问题,还是希望使用单个堆栈并自己编写代码。两者都能起作用,而且都不是微不足道的。团队经验很可能是决定因素。
DevOps中的反馈循环比现代CI开发环境糟糕得多,所以你必须做更多的计划&提前调查。你在一天内可以运行的实验数量要少得多,至少是20倍左右,所以让事情第一次成功是很困难的。确保你有经验的人这样做。
答案是:Robot Framework(见1或2)。
- 支持数据驱动测试和行为测试
- 测试使用用户定义的关键字,以类似人类的语言编写。易于开发,易于阅读,易于维护。
- 大量的库访问不同的功能(ssh连接,数据库,.....)
- 可以使用python, java或其他语言编写的自定义库进行扩展。
- 为每个测试生成一个详细的日志
我不知道Jenkins,但我很确定你可以将Robot Framework与它集成。
根据系统的复杂程度,您可以使用多种工具。一般来说,您需要某种工作流程,并在最后将结果可视化。与其给出一个明确的答案,不如让我给你指出一些工具/插件。
詹金斯:- MultiJob插件允许你将工作流指定为阶段,并使用并行作业阶段 BuildFlow插件可以让你在一个简单的DSL中创建自己的并行和依赖的构建流。
- Plot插件收集指标并绘制这些随时间的变化
- xUnit插件,用于从测试中捕获JUnit样式的xml或JSON,例如由小脚本或xUnit框架(如py)生成。
- 与OFrandeDiEnne的答案相关的RobotFramework插件。
Vagrant: Vagrant基本上是一个位于VirtualBox虚拟机之上的命令行界面。你可以用它来同时启动多个虚拟机(甚至可以从Jenkins中完成)。使用Puppet、Chef、SaltStack等提供程序来设置数据库、配置等。
构建流工具,例如由运行时设计自动化(RTDA)提供的工具。商业。这很可能是矫枉过正。
如果您的测试服务器有OpenSSH或其他SSH服务器服务,您可以通过SSH Chanel启动测试。
例如,Java语言中:
- 你可以使用TestNG或JUnit来组织测试用例,两者都很容易与Jenkins集成。
- 在测试代码中,导入JSCH并创建自己的ssh客户端,以便在远程服务器上执行命令行。或者将命令行推送到plink.exe (Putty的一部分)或其他第三方ssh客户端,这些客户端也将用于执行命令行。对于并行执行,只需使用多线程来推送命令。
- 检查返回的代码和消息。
同样,你也可以使用Robot Framework来做到这一点,这也很容易与Jenkins集成(有一个第三方插件)。它也有ootb ssh库。
甚至,如果您的应用程序没有命令行入口,您还可以使用AutoIT库通过GUI操作应用程序。