我们的开发应用程序有大约12个本土插件和许多Origen宝石,需要从开发到生产级别的质量。我看到许多杂项主题从here开始,但我在app /插件版本控制,Origen模式(调试和生产)以及参考文件和示例等项目上看不到太多。我知道有' origen规格'运行rspec的命令,但是&orce;来测试' origen测试'和其他相关项目。
THX
答案 0 :(得分:2)
有关此主题的文档在实际上有点薄,这里有一些信息可以解决这个问题:
运行时模式
是的,Origen确实有调试和生产模式的概念 - http://origen-sdk.org/origen/guides/runtime/mode/
在生产模式下运行确实为您提供了一些基本保护,可以防止本地编辑进入生产版本,但实际上我认为现在有许多项目正在生产,它们一直只使用调试模式。
我认为生产模式的主要好处是您可以使用它来实现您关心的特定于域的检查。例如,在我的一个应用程序中,我有一个before_generate
回调处理程序,它检查我们正在使用的产品固件是否为我们正在构建生产时的最新发布版本。
另一种有用的技术是将模式嵌入到应用程序生成的程序,模式或测试名称之类的内容中。这使得很明显是否有人将调试版本用于他们想要发布到生产中的东西。
<强>版本强>
公司内部插件应该以与Origen和开源插件相同的方式进行版本标记和发布。
通常每个人都会通过运行origen rc tag
命令来执行此操作,该命令将标记插件,维护发布历史记录,以及构建gem并将其发布到gem服务器。
插件通常应该注意不要在其.gemspec
文件中锁定其依赖项的特定版本,而应该指定最小版本。像这样的东西是好的,这意味着依赖的任何版本1都大于1.2.3:'~>1', '>1.2.3'
。有关如何指定gem版本的更多信息,请参见此处:http://guides.rubygems.org/patterns/#declaring-dependencies
另一方面,顶级应用程序通常希望锁定其Gemfile
内特定版本的gem,以便它们的构建可重现。理论上,您可以通过签入Gemfile.lock
文件免费获得,这意味着当bundler在新工作区中构建gem包时,它将使用该文件中指定的确切版本,即使{{1中的规则可能允许一系列可能的版本。
在实践中,许多工程师倾向于通过在Gemfile
中指定绝对版本来采用更严格/更具声明性的方法。
单元测试
单元测试几乎总是通过rspec工具和通过Gemfile
命令启动的约定来完成。
单元测试很好,因为它们可以针对非常具体的功能,因此它们在失败时相对容易调试。
这些测试通常对于进行测试驱动开发非常有用,特别是在创建新API时。该技术是使用写入行为来测试以定义您希望的API,然后进行必要的更改以使测试通过。
这些测试的缺点是它们需要时间来编写,并且在经受时间压力时经常会掉线。 编写它们也是一种艺术,有时对于经验不足的工程师来说,知道如何编写测试来定位特定功能是很困难的。
出于这个原因,单元测试往往更多地用于插件,特别是那些为父应用程序提供API的插件。 顶级应用程序,特别是那些与生成模式或测试程序有关的应用程序,往往依赖于基于差异的测试......
基于差异的测试
基于差异或验收测试,意味着有人祝福特定输出(即模式或测试程序文件)为“好”和“好”。然后可以创建测试,只要说当前输出与先前已知的良好输出相匹配,那么测试就应该通过。
如果遇到差异,则测试将失败,工程师必须检查更改并确定是否不需要并突出显示真正的问题,或者更改是否可接受/预期在哪种情况下新输出应该成为新的已知的良好参考。
这种测试方式的优势在于它不会花费任何时间来编写测试,但它可以提供极高的测试覆盖率。缺点是,由于测试覆盖了大的表面积,因此有时难以追踪不需要的差异的来源。 另一个问题可能是,如果您进行全局影响所有输出的更改,则不需要的差异可能会在噪声中丢失。因此,最好单独进行此类更改。
许多插件和Origen本身通过一个名为origen specs
的命令实现这种测试方式,已知的良好输出被检入origen examples
目录。
某些应用程序还实现了一个名为approved
的命令,它只是一个将origen test
和origen specs
组合成一个命令的包装器,这对于创建组合的测试覆盖率分析非常有用(更多信息,请参阅以下)。
您应该参考一些开源存储库以获取有关如何创建这些命令的示例,但所有新的Origen应用程序shell都应附带origen examples
中注释掉的示例代码。
当其占地面积相对较小时,检查批准的输出是正常的,但对于可能生成数千个模式或文件和/或支持许多不同目标的大型生产应用程序,那么检查所有内容并不是那么实用。
同样在这种情况下,与应用程序的版本X相比,输出中的内容有时变得更有用了吗?&#34;而不是总是与最新的已知良好版本进行比较。< / p>
您可以通过签出应用程序的特定版本,生成输出,然后使用config/commands.rb
命令在本地保存已批准的输出来手动运行此类测试。然后检查应用程序的最新版本,再次运行相同的生成命令,看看是否有任何更改。
一段时间后,工作流程会变得乏味,因此Origen通过回归管理器为其提供帮助:http://origen-sdk.org/origen/api/Origen/RegressionManager.html
应用程序通常将其集成为名为origen save all
的命令。
下面列出了我的某个应用程序的origen regression
命令的完整实现,以提供如何创建它的示例。
在这种情况下,我们使用Origen的LSF API来并行化命令,但如果您不使用它,只需将origen regression
替换为Origen.lsf.submit_origen_job cmd
即可在本地运行您的生成命令。
回归管理器将负责在当前和以前版本的应用程序中复制相同的命令,并为您提供差异的结果。
请注意,如果您想针对上次运行的应用程序的相同旧版本重新运行回归,也可以提供system cmd
。
测试覆盖率
使用build_reference: false
或-c
开关运行任何Origen命令都可以生成测试覆盖率报告,您可以查看该报告以了解测试套件的运行情况。
以下是覆盖率报告的示例 - http://origen-sdk.org/jtag/coverage/#_AllFiles
--coverage