跳到主要内容

保存的文章

提升敏捷门票现在可用:有限的时间节省40%了解更多

连续单位检查:
第二部分

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

连续单位检查

我们刚刚说到哪了?

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

在第1部分中,我们研究了基于shell命令和包装脚本的一些简单的连续检查解决方案。让我们开始爬工具堆,看看我们发现了什么。

守卫Ruby.

Guard举例说明了普通命令行工具的下一个级别“向上”。

在Ruby World中有几种连续单元测试工具,其中两个是显着的和广泛使用的:ZenTest和守卫。

ZenTest是一个包含四个工具的套件,其中autotest支持当受监视的目录中的任何文件更改时,支持单位检查的自动运行。AutoTest和Guard都是可配置的,以通过文件名来过滤文件,并控制在纠正失败后是否执行完整的测试套件。这些功能超出了我们可以轻松地使用基本命令行实用程序和shell脚本来实现的目标。

如前所述,附加功能以更复杂的成本为本。这些工具具有必须设置的配置文件,并且在后卫的情况下,必须执行的初始化以启用某些功能。

获得更多功能的另一个成本是可以支持哪些代码的一些限制。ZenTest和guard专门用于支持Ruby应用程序开发。而直接命令行工具不在乎语言我们写作,因为他们可以执行任何脚本写我们关心,这些工具旨在了解Ruby像测试:单元测试框架:单位,小型试验和rspec,以及约定通常使用Ruby项目像Rails的常见类型。

原则上,你可以使用除Ruby之外的其他语言的autotest或guard,但在实践中,人们通常不这样做。将一种特定于语言的工具用于支持另一种语言的努力是非常重要的,如果已经有了其他语言可用的工具,为什么还要麻烦呢?

让我们设置警卫以监视类似于我们之前查看的Python示例的琐碎的Ruby应用程序。下面是“应用程序”代码:

class Incrementer def increment number number = 1 end结束

这里是完整的“单元测试套件”。它使用rspec。

Require "spec_helper" require_relative "../app/incrementer" RSpec.describe incrementer do context " incrementnumbers " do before(:each) do @incr = incrementer。New end it“increments 1 results 2”do expect(@incr.increment(1))。到eq(2)端端端

显然,即使对于这个极其简单的例子,也不是一组足够的单位检查,以涵盖增量方法的可能性。我们的目的是展示连续测试工具的设置,而不是在任何程度上锻炼RSPEC或Ruby。这将是。

我们使用Bundler定义我们应用程序的依赖关系。对于此示例,Gemfile包含以下内容:

来源“http://rubygems.org”组:测试,:开发做宝石“守卫”宝石“守卫 -  rspec”宝石“rspec”宝石“耙子”结束

至少我们需要宝石守卫。我们正在使用Rake,标准的Ruby制作实用程序,建立我们的项目,RSPEC,一个面向行为的单位检查工具在Ruby社区中流行。我们需要为那些人提取宝石,以及额外的宝石,以便在警卫中提供RSPEC支持。BUNDLE INSTALL命令安装这些GEMS,除非它们已存在于系统上。我们从项目根目录中运行命令。

捆绑安装--Path供应商/捆绑

path选项告诉绑定器将gems保存在项目的子目录./vendor/bundle中,而不是全局安装它们。我们在不使用sudo的情况下运行该命令,因为这将在用户空间中存储gems。这是Ruby应用程序的常见约定。

使用这些宝石,我们需要配置防护队与我们的应用程序一起使用。这是事物比基本命令行工具更复杂的地方。我们将使用Bundler为Guard运行几个设置命令。这些是从我们的项目根目录执行的。

bundle exec guard init bundle exec guard init rspec

Bundle Exec Guard init命令在项目根目录中创建模板保护文件。护栏文件包含控制如何运行的配置。

bundle exec guard init rspec命令将特定于rspec的配置设置添加到Guardfile中。当您在自己的系统上运行它时,您会注意到它添加了Rails、Capybara和Turnip的规范。我们在“incrementer”应用程序中没有使用它们,所以我们可以从Guardfile中删除它们。对于我们的简单示例,我们在Guardfile中所需要的就是:

Guard:rspec,cmd:“bundle execrspec”,failed_mode :: leat do watch(%r {^ app /(。+)\。rb $}){| m |“spec”}手表(%r {^ spec /.+_ spec \ .rb $}){| m |“规格”}结束

如果你想认真对待警卫,那么有很多文件可用。出于我们的立即目的,这些规范请告诉警卫,只要它在App子目录中检测到文件中的更改,即在.rb中以_spec.rb的名称结尾的标志目录中检测到文件子目录中的文件,或其名称以_spec.rb所结束的规范目录。读取'failed_mode的位::保持'告诉警卫继续运行失败,直到它们通过。否则,它将仅运行与修改的文件相关的规范。

以下是开发人员工作流程如何在使用后面的样子。

在我看来,与简单的命令行设置相比,使用guard有两个明显的优点:

  • 所有平台都是一样的,因为它是一种红宝石的应用程序;shell语言平台支持或操作系统命令看起来都不重要。直接命令行解决方案可能需要在平台之间进行一些调整。
  • 它只运行与刚刚更改的代码相关的示例,并重新运行任何失败的示例,直到它们通过(由于我们的Guardfile中的' failed_mode '设置)。命令行上的一个简单循环将每次运行所有内容,除非我们编写复杂的脚本来决定运行哪个示例。

唯一的缺点是它适用于Ruby应用程序,但不适用于Java、c#、Python、c++等。这是为特定语言量身定制的持续测试工具的特点。工具对特定语言及其约定“了解”越多,它对其他语言的用处就越小。即使在技术上可行的情况下,人们也没有在自己的开发社区之外寻找工具的习惯。一些使用c#的人可能会留在。net生态系统中。

Scala的SBT.

我感动了sbt在早期的帖子中探索最小开发环境的可行性。让我们在连续单位检查的背景下再次看它。

SBT旨在支持Scala开发。与此类别中的其他工具一样,您可以配置它以支持其他语言,但很少有人这样做。它是基于Java的,原则上是这样的能够除了Scala之外,支持其他JVM语言,就像Gradle和Maven一样能够除Java / Groovy / Kotlin之外,还支持其他语言,但配置可能变得复杂。

您需要安装JDK 8或更高版本。Oracle或OpenJDK都可以。有了它,我就这样在MacBook Pro上安装了sbt:

BREW安装SBT @ 1 SBT

SBT的初始执行下载依赖关系并获取使用SBT设置的东西。

此工具是Java Ecosystem的一部分,因此它假设类似于Maven Arucon的默认项目目录结构,以及Scala Helper文件的可选“项目”子目录。

项目根目录/——项目/ | | + + - src / | + -主要 / | | | +-- 资源 / | | | +-- 亚傅体育appscala / | | | +-- java / | +——测试/ / | + | +——资源——scala / | + java /

生成的工件被写入项目根目录下的' target '子目录。

像许多构建工具一样,sbt使用配置文件来控制其操作的各个方面。按照惯例,这里有一个“构建”。sbt’ in the project root directory. Configuration settings can be organized in some logical way and separated into different files, if that makes sense in your situation. All files named ‘*.sbt’ will be read.

命令sbt启动a其中你可以执行SBT任务。有很多东西可以了解SBT任务(超出这篇文章的范围)。

SBT中内置了连续构建和测试功能。如果使用“SBT”启动shell然后输入带有TINDE(〜)的命令前缀,则SBT将监视默认目录结构并在更改文件时运行该命令。因此,您可以使用这些命令进行连续单位检查:

sbt > ~ testQuick

您可以通过按Enter键停止监控更改。要终止求建,请输入命令“退出”。(进入退出。哈。有趣的。)

让我们再次尝试我们的“增量”应用程序来检查sbt的连续测试工作流程。下面是“应用程序”代码:

{} trait Increment {def Increment (a:Int): Int = a + 1}

这是全面,奇怪设计的测试套件:

包示例导入org.scalatest._类incratingpec将flatspec与匹配器扩展{“递增器对象”应“返回3”在{uctimenter.increment(2)} nantequal 3}}

而且,这是开发人员工作流程的样子:

您可以看到模式与到目前为止一直都是一样的,但事情似乎需要更长时间才能执行。这部分是由于Java语言的性质。工具必须在运行之前下载各种罐子。编译需要一些时间,即使源代码非常小。Rept无法快速对输入进行反应。这是使用更多复杂工具的“成本”的一部分。您可以获得更多功能,但还有更多的代码涉及和更多配置。

下一步是什么?

在下一部分中,我们将继续下去命令行并探索IDE环境中的持续检查。

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

留下你的评论

您的电子邮件地址不会被公开。必需的地方已做标记