跳转到主要内容

保存的文章

连续单位检查:
第一部分

Dave Nicolette |领导敏捷
Dave Nicolette 高级顾问
读: 连续单元检查:第一部分

连续单位检查

  • 第1部分:命令行实用程序和包装器脚本
  • 第2部分:防护(用Ruby)和SBT(带Scala)
  • 第3部分:无限(使用Java和IntelliJ IDEA)

回到当天,我们曾经运行编译,链接,并单独和手动执行步骤(步行15英里,从过度往返学校,两种方式上坡)。作为成熟的开发环境(IDE)成熟,它们包裹了这些步骤,以便我们不需要一遍又一遍地手动操作。这是一个很大的一步,因为我们可以保持专注于解决手头的问题而不会被建立我们解决方案的机械细节分散注意力。

随着测试驱动开发(TDD)和微测试成为主流实践,我们开始再次感受到那些旧的干扰。当我们对代码和微测试进行微小的增量更改时,我们必须记住点击“运行测试”按钮或按下分配给“运行测试”的按键序列。

一个常见的问题TDDERS遇到的是,我们忘记在每次变化之后运行我们的单位检查,因为我们的思想占据了手头的问题。我已经看到有经验的从业者,即使在给予TDD的示威时也会这样做。

这是应该是。我们的思想应该专注于解决方案,而不是构建代码和运行自动检查的机械细节。

连续集成工具和实践使我们在更高层次的自动检查中提供了这种自动化。有没有一种实用的方法,可以将此操作烘焙到我们的工具或微级别,正如我们在编译和链接所做的那样?

幸运的是,有几种方法。它们的范围从简单和粗糙到复杂和聪明。

让我们悄悄地进入这个话题,从最原始的方法开始,然后沿着我们的道路前进。

在本分期上,我们将使用命令行实用程序滚动自己的连续测试解决方案,我们将查看简单的包装脚本。

简单的应用程序的初始示例

我们需要一些东西来运行前一对例子。这是我使用的是:一个递增整数的Python脚本,另一个脚本运行一个替换IT的另一个。这两个文件都在同一目录中,没有项目设置或明确定义的名称空间。

这是“应用程序”。increment.py。

“开创性的应用,将改变世界”def increment(a):返回a + 1

这是“测试套件”。test_increment.py。

# !/usr/local/bin/python3 import unittest from increment (unittest. testcase):assertEqual(increment(1), 2) if __name__ == '__main__': unittest.main()

命令行循环

对于快速且较肮脏的连续测试设置,您可以在命令行上编写无限循环(不在脚本中)在计时器上运行您的构建/测试命令。以下是使用Bash的示例:

而:;做。/ test_increment.py;睡眠5;完成

那些命令创建一个无限循环(while :)其中脚本。/ test_increment.py每5秒执行。当您准备停止时,您可以使用Ctrl + C中断循环。

为什么bash ?它是大多数Linux系统和Mac OSX (Unix系统)上的默认shell,并且在所有Unix和Linux系统上都是一个常见的选项,即使它不是默认的。它包含在面向Linux的Windows子系统,你可以使用它通过cygwin.在Windows上,如果你喜欢的话。因此,它可以在开发人员可能使用的所有主流系统上使用。但这只是一个例子;您可以使用任何shell语言做类似的事情。

这是一个琐碎的例子,让您了解工作流程所需的样子。

尽管这是一种粗糙的方法,但与预先构建的连续测试工具相比,它有一个优势,即您可以在循环中执行任何您想要的代码。这是一个一般规则的特例——如果你愿意从头开始,你可以让它做任何你想做的事情,只受你愿意投入的汗水的数量的限制。然而,这里有两个重要的限制。

首先,您可能不想无条件地运行测试N秒。你可能在那段时间里没有做任何改变;毕竟,大多数软件开发工作包括思考,而不是打字。相反,当你在编码的狂潮中,你可能需要比其他人更频繁地检查结果N秒。

其次,如果您想根据修改后的代码与代码库中的其他代码之间的关系,使用任何类型的健壮试探法来控制测试用例的选择,那么您必须构建一个应用程序来实现这一点。这是更复杂的连续测试工具提供的关键价值。在一个简单的命令行上工作,您离实现这类功能还有很长的路要走。

查看修改目录

一种稍微好一点的方法是观察目录的变化,并在发生变化时启动构建/测试脚本。下面是我在Mac OSX上使用实用程序fswatch的一个例子。首先,使用自制软件安装fswatch:

Brew更新Brew安装fswatch

然后,在命令行上启动fswatch,并指定每次对正在监视的目录中的文件发生更改时要运行的脚本。这个例子在任何文件以任何方式改变时运行一个单元检查脚本:

fswatch 0。| xargs -0 -n1 -I{} ./test_increment.py .py

此工具允许某种控制对其应监视的各种更改。与第一个方法一样,您可以执行任何脚本,并且您可以包含自己的逻辑,以确定根据修改类型以及受影响哪些文件的处理。看看fswatch文档获取详细信息。

这是一个琐碎的例子,让您了解工作流程所需的样子。

Fswatch并不是这类工具的唯一。如果它不能用于您的平台,您可以使用另一个。例如,inotifywait可用于Linux平台。

Inotify-Tools Wiki有在所有Linux发行版和FreeBSD Unix上安装该包的说明。Slackware Linux默认包括inotify工具。你也可以从源代码构建;过程被记录在wiki上。

下面是与上面fswatch相同的简单设置,但是在bash中使用inotifywait的无限循环:

而:;执行inotifywait -e modify,create,delete -r操作。& &。/ test_increment.py;完成

但我不使用Linux / Unix!

Windows怎么样?您可以使用Linux子系统或Cywin,但如果您愿意坚持使用本机的Windows工具,有办法可以完成相同的目标。看到这一点StackOverflow回答开始。它讲的是写aFileSystemWatcher类来在检测到更改时生成事件。需要一点血汗资本。

环球呢?如果您使用IBM大型机技术,您可以通过zOS访问许多与在Linux和Unix系统上相同的工具Unix系统服务(号)。与目前的大多数操作系统一样,zOS公开了一个类Unix的shell,它提供命令行并支持常用的Unix实用程序。默认的shell是tcsh,但是您可以从移植工具

HP uninterrupted(以前的Tandem)怎么样?HP不间断有一个名为开放系统服务(Open System Services, OSS)的工具,它公开了一个POSIX shell并提供了常用的Unix命令。它支持korn,但不支持bash。您可以在korn中编写与bash中相同的命令行循环。这个系统的大部分文档都以PDF文件的形式发布。一个好的开始是OSS Shell和实用程序参考手册

包装脚本

喜欢在单元或微测试级别进行连续测试的人已经编写了许多脚本来包装命令行功能,并使其更容易接受自动化。其中最简单的方法与使用普通命令行工具非常相似。

通过一个例子约翰·雅各布森,原本是支持Python的,被称为。项目回购已经开始Github,可以用pip安装。安装pip的步骤因平台而异。下面是我在MacBook Pro上安装它的方法:

卷曲https://bootstrap.pypa.io/ge-pip.py> get-pip.py sudo python get-pip.py

我的理解是,easy_install已经被弃用,取而代之的是get-pip.py。

然后,安装Conttest包括:

Sudo PIP安装龙卷风Sudo PIP安装鼻子Sudo PIP安装竞赛

安装工作需要鼻子,但Conttest不需要它。您可以使用您希望的任何测试框架 - Pytest,PyUnit,Unittest,当然是鼻子。对于我使用unittest的简单示例,Conttest工作很好。它与fscatch或inotifywait或命令行循环的行为相同。

续。/ test_increment.py

ContTest提供文件名模式以排除文件的选项,并且在文件中检测到更改时不限于运行您希望运行的任何代码。您也可以使用它来持续测试除Python以外的语言。

但是您可以使用标准命令行工具完成所有相同的工作。包装器脚本的优点是什么?

使用只有重复命令行循环的行为的包装可能没有很大的好处,特别是当我们的“应用程序”与Python示例一样简单时,我们一直探索。我想你会发现,当我们爬上一堆工具时,我们以更复杂的配置和限制我们的控制成本,我们获得更复杂的功能。

在某些情况下,这种权衡是值得的;例如,使用无限使用IDE内的Java提供了良好的价值,而虽然类似的配置程度可能无法为其他语言偿还。

下一步是什么?

在第2部分中,我们将在工具堆上爬上升高,看看几个解决方案,以超越简单的外壳脚本。红宝石宝石,警卫,是该社区中流行的工具,并且sbt聚焦于scala的工具是什么可以支持Java(虽然很少有Java开发人员使用它),以及通过插件的其他语言。这些与命令行开发人员工作流一起使用,但它们不仅仅是包装器脚本。

在第3部分中,我们将攀上最顶端,查看Infinitest,它是一个支持JetBrains IntelliJ IDEA和Eclipse的IDE插件。最初创建它是为了支持Java和Groovy。和这个类别中的其他工具一样,它可以可以与其他语言一起使用,但大多数开发人员不这样使用它。对于喜欢基于ide的开发人员工作流和从事Java项目的人来说,Infinitest是一个实用的选择。

下一个;连续单位检查:
第二部分

留下你的评论

您的电子邮件地址将不会被公布。必填字段被标记*