BDD 和微服务

Posted

技术标签:

【中文标题】BDD 和微服务【英文标题】:BDD and microservices 【发布时间】:2015-08-17 18:05:11 【问题描述】:

我们的解决方案依赖于微服务。另一方面,我们的 CIO 希望我们在每一个新功能上都实践行为驱动开发。

是否可以在微服务架构中管理 BDD?根据您的经验,针对这样的架构采用 BDD 是一种好的做法,还是您认为我们应该直接关注集成测试?

[编辑]

更准确地说,在我看来,BDD 测试应该验证业务逻辑,并且只验证业务逻辑。在许多框架中,BDD 测试场景是由滑冰者使用 DSL 创建的。 BDD 测试倾向于收敛于排他的“基础设施无知”实践。另一方面,集成测试应该验证解决方案是否与目标基础设施匹配(它们由 DevOps 完成?),并且只与基础设施匹配。当业务功能“分布”在微服务上时,您应该模拟 BDD 测试环境(应该是本地环境)中的几乎所有内容(基础设施和业务),而模拟业务会大大削弱您的目标。您认为这些做法是否兼容?

【问题讨论】:

BDD in Action 的作者认为它们是兼容的:slideshare.net/wakaleo/bdddriven-microservices 感谢您的关注。我刚刚阅读了 JF Smart 写的一些文章,我们对这个问题有相同的看法。他说它们在开发的不同阶段是兼容的。如果解决方案架构能够实现(我希望下降架构能够实现),那么 BDD 最适合业务验收测试。一旦验收测试OK,集成测试旨在针对目标基础设施测试解决方案。关注点分离。他声称从集成测试中将接受默认值推回给开发人员是浪费时间。兼容,但不一样。 【参考方案1】:

您为什么认为 BDD 和集成测试不同?

BDD 只是意味着通过所需的行为来驱动您的设计,通常通过一组验收测试来表达。

这些测试可能是涉及许多 [微] 服务的“集成测试”,也可能是指定单个服务或该服务中单个类的所需行为的测试。理想情况下,将在所有这些级别上进行混合测试。重要的是您指定您想要的行为并使用它来推动开发。

您的系统如何实现在某种程度上是无关紧要的,只要它表现出预期的行为。对于将系统视为黑盒的高级测试,这是正确的,并且越往下走,越接近实际代码,这就越不正确(因为此时您正在有效地测试实现)。

因此,我将专注于新功能的预期行为,并首先为这些验收测试编写规范,然后实施您的服务以实现所需的行为,根据需要以务实的方式添加较低级别的测试,请记住测试级别越低,它们就越容易变得脆弱,并且需要在您更改实现时进行更改。

编辑

根据您的问题编辑。

我不同意 BDD 测试应该只测试业务逻辑。事实上,BDD 测试通常更侧重于测试整个系统,将所有部分集成在一起。话虽如此,BDD 只是一种通过指定所需行为的测试风格,并且可以应用于应用程序的任何级别。您可以通过使用 Gherkin 语法指定行为来测试单个类,我们有时会这样做。我们还使用 Gherkin 指定整个系统的预期行为以及我们服务的预期行为。根据我们所针对的级别,这些测试的格式自然会略有不同。

对于系统测试,我们可能有这样的规范:

Scenario: user can perform action A
   Given I am a user with access to some feature A
   And feature A is enabled for the user
   When I call perform action A with parameters 'Bob' and 'John'
   Then A 'BobJohn' is created
   And notifications are sent to the current user

对于个别服务,我们可能会有类似的测试

Scenario: create messages are handled correctly
   Given the service is set up
   When a message arrives to create a 'BobJohn'
   Then a new entry is added to the database with the key 'BobJohn'
   And an outgoing notification message for 'BobJohn' is created

对于个别类,我们可能会有类似的测试

Scenario: Notifier class should send notifications via all users preferred means
    Given the current user wants notification by Twitter
    And the current user who wants notification by email
    When I send the notification 'BobJohn' to the current user
    Then the twitter notifier should be invoked with 'BobJohn'
    And the email notifier should be invoked with 'BobJohn'

这些都是 BDD 风格的测试,但它们测试系统的不同方面。

【讨论】:

非常感谢您的反馈,我部分同意您的观点,但这正是我提出问题的全部目的。我编辑了这个问题,你怎么看? 感谢山姆的反馈【参考方案2】:

我相信对服务进行功能测试的能力是质量的一个很好的标志。集成测试昂贵、缓慢且痛苦。集成测试不是说明您的行为是否正确的地方,它的历史目的是说明组件是否正确交互。

【讨论】:

以上是关于BDD 和微服务的主要内容,如果未能解决你的问题,请参考以下文章

springcloud01-微服务和微服务架构

SpringCloud01:回顾微服务和微服务架构

我所理解的SOA和微服务

SOA和微服务到底是什么关系?

授权和微服务

华为云容器和微服务是什么?