与多个应用程序共享Specflow功能文件

时间:2014-02-28 05:55:36

标签: visual-studio testing specflow

我的目标是能够编写我可以在单元测试框架中使用的核心测试以及使用selenium进行UI测试。

对于简单的测试,如:

Scenario: Add two numbers
Given I have entered 50 into the calculator
And I have entered 70 into the calculator
When I press add
Then the result should be 120

我会创建两个单元测试来证明我的核心API会通过Selenium测试来证明我的UI也正在做正确的事情。

我曾试图找到任何通过Google做类似事情的人,但找不到任何例子。所以我想我的问题是,这里有没有人做过类似的事情?

我想到的方法很简单,就是将特征文件添加到项目或目录中,并使用添加现有项作为链接作为解决方案。

更新:将功能文件添加到公共目录并将其添加为链接似乎效果很好。功能绑定为每个项目重新生成功能文件,因此我可以在一个中运行单元测试,在另一个中运行Selenium UI测试。

2 个答案:

答案 0 :(得分:0)

首先,让我们开始讨论您为什么要这样做。它的好laziness

  

使您努力降低整体能源消耗的质量。它可以让你编写其他人会觉得有用的节省人力的程序,并记录你所写的内容,这样你就不必回答很多关于它的问题了。因此,程序员的第一个伟大的美德。因此,这本书。另见急躁和傲慢。 (p.609)

     

Larry Wall,编程Perl

除非它不是,因为我们不会减少我们的整体能源消耗。

当您使用SpecFlow时,保持最新的简单部分是纯文本。您会发现自己一次又一次地重构[Binding],但这些场景往往很容易使用,并且一旦达成一致就需要很少修改。

此外,[Binding]是全球性的。从任何组件加载它们,它们可供SpecFlow运行器使用。对于你正在尝试的内容,这实际上会使事情变得更加困难,因为你需要付出努力来保持UI绑定不与非UI绑定混合。

还要考虑SpecFlow实际运行功能文件测试的方式。这是一个两阶段的过程。

  1. 保存.feature文件时,SpecFlow VS插件会生成.feature.cs文件。
  2. 当您运行测试引擎(例如NUnit)时,它会忽略纯文本并使用来自.feature.cs的编译代码
  3. 因此,如果您开始使用链接的.features,我不知道SpecFlow插件是否会为该文件的两个实例生成.feature.cs。 (如果你试试这个,请告诉我们)

    其次让我们考虑一下这些功能。我认为你会经常发现自己正在试验你的测试,以使它们适合他们使用的其他地方。您已经在示例中提供了on the screen。如果您只使用核心API ,那么就没有屏幕,所以我们是否更改此选项以更好地适应非UI场景?

    最后你需要考虑另一件事,你的测试会有多大用处。如果您已经有一个测试 Core API 的测试,那么通过Selenium运行相同测试意味着什么。你真正要测试的就是UI层。在我目前的工作中,我们有大量的回归测试来执行这种非常类型的测试,运行连接到服务器并操纵UI以获得所需方案的客户端。由于它们的规模,这些是我们最脆弱的测试。它们经常断开,我们基本上必须检查我们的整个代码库,找到打破它们的行。通常情况下,其中10-100个只会换一行。如果这些测试对回归周期不那么重要,那么维护它们的努力就会太多。在我自己的个人项目中,我倾向于完全删除这些测试,而不是使用UI,我避免测试View层。使用WPF MVVM,我执行Command并在ViewModel s中测试结果。如果有人决定TextBox应该是ComboBox,或者它会在mauve中更好地工作,那么我的测试就会被隔离。

    简而言之,您无法在Google上找到任何相关内容: - )

答案 1 :(得分:0)

一般情况下(参见http://martinfowler.com/bliki/TestPyramid.html),应该限制直接测试UI的自动化测试的数量,并且更喜欢从表示层(视图层下方)或下面开始的测试。

SpecFlow是不可知的;测试可以使用例如UI层的Selenium或下面任何一层的MSTest或NUnit。

但是,我已经说过,我很欣赏你会遇到ATDD的情况,并希望实施SpecFlow场景以匹配每个验收标准。有些标准可以在较低的架构级别进行测试,但其中一个或两个可能是特定于GUI的 - 例如测试登录并确保用户在成功登录后重定向到主页。如果使用Angular2或React路由(请参阅https://en.wikipedia.org/wiki/Single-page_application),那么重定向可能在GUI层本身中完成。

我还没有一个完美的答案,但作为一名经过认证的SpecFlow培训师,我对此有一定的兴趣!我目前倾向于使用像CucumberJS这样的补充工具进行前端特定测试(例如测试React路由器重定向)和SpecFlow用于较低架构层的测试。我们的前端使用Node.JS / Express,我们的后端是.NET Core。我们的想法是,前端测试主要使用前端只有模拟后端的AJAX调用(参见sinonjs),后端测试使用EF Core和内存中选项(参见docs.efproject)。 net / en / latest / providers / in-memory /。所以测试都运行得很快。

当然,你仍然需要一些实际上已经完成的测试,但那些是不同的 - 我们应该调用那些集成测试。我不认为验收测试需要进行集成测试。这样,您就可以通过ATDD进行一系列验收测试,以及一组相对较小的集成测试,这些测试可以从前到后进行测试。集成测试运行速度更慢,需要更多维护,因此您将它们分离到CI / CD构建链的不同部分。

我希望这是有道理的。解决这个问题不是因为避免问题。