小黄瓜 - 你怎么用英语写一个明确的测试用例?

时间:2015-02-03 12:13:43

标签: java automated-tests gherkin

英语可能含糊不清,在我看来,采用Gherkin的方法有一个假设,即在某种程度上说英语的人,即使在编写任何代码之前,也可以编写和理解测试用例。 / p>

鉴于以下需要自动化的简单测试场景,该方法如何指导您工作:

在图书馆应用程序中,要向图书馆添加图书,用户点击“添加”,弹出“图书信息”对话框,并希望用户填写图书标题等。然后单击“确定”。

假设QA人写下以下内容:

Scenario: clicking the Add button
    Given a user who is already logged in to the application
    When the user clicks the Add button
    Then the Book Info dialog is displayed

够简单吗?这是一个很好的测试吗? 我想我会说英语,但我不明白。

对话框中的字段应为空,也许某些字段应具有某些默认值或初始值。也许测试人员期望实现"然后显示书本信息对话框"确保所有这一切,但实施者是否知道这一点?这是怎么传达的?

也许测试应该写成

Scenario: clicking the Add button
    Given a user who is already logged in to the application
    When the user clicks the Add button
    Then the Book Info dialog is displayed and all the fields are empty

添加点击和显示对话框之间可能需要几秒钟。因此,测试可能会失败,因为如果对话框启动,或者没有等待足够长的时间来显示对话框,并且测试失败,则实施过早检查。

进行手动测试的人不需要涉及该问题,除非对话框出现需要很长时间。所以上面就是这个人编写测试的原因(所以这里的重点是测试人员需要足够聪明才能考虑到这一点,或者某些开发人员需要解释这一点,或者他们只是在测试失败后修复它)

不知何故,这个简单的动作需要更多信息......什么时候在编写测试的人和实现测试操作的人之间进行通信?

也许测试应该写成

Scenario: clicking the Add button
    Given a user who is already logged in to the application
    When the user clicks the Add button
    Then the Book Info dialog is displayed within a couple of seconds  and all the fields are empty

或者它应该写成:

Scenario: clicking the Add button
    Given a user who is already logged in to the application
    When the user clicks the Add button
         And the user waits a couple of seconds
    Then the Book Info dialog is displayed and all the fields are empty

用英语撰写考试的人是否应该

  1. 在测试操作中写下所有期望,例如: "然后在几秒钟内显示“书籍信息”对话框,所有字段都为空"或
  2. 在&#34中编写简短陈述;显示书籍信息对话框"但是然后写一个额外的文件来描述(用英语)这个陈述的含义,以及所有的期望是什么?

2 个答案:

答案 0 :(得分:3)

在一般情况下,我会争论(接近)第二个。

如果你通过添加假设来重复“噪音”污染你的场景,你就失去了BDD旨在实现的简洁,有针对性的理想。也很难知道在哪里停下来。

也就是说,如果你的故事/场景有针对这些的特定要求,或者即使你希望它对这些有影响,那么就没有什么可以阻止添加And all input fields are empty等附加条款。

请注意,如果您使用的是Agile methodology Scrum,那么您将拥有单独的完成定义,虽然更多业务或类似流程,但可以包含接受故事的“全球”要求。这些可能包括测试覆盖水平或性能要求......可以说与您在此讨论的内容相近。

答案 1 :(得分:2)

我认为你的问题始于你写得不好(并且构思不佳)的场景描述,而这个错误会逐步落入你的场景步骤。 “单击添加按钮”不是方案,而是一个步骤。而你甚至通过让它成为你的步骤而暗中承认。 :d

如果我不知道您的用户在这种情况下的目标是什么,以及您尝试通过此测试向用户证明的内容,那么我无法告诉您在步骤中包含或不包含多少特异性

并且,如果没有您在问题中提供的所有解释和背景,则无法从您的场景文本中获取任何解释和背景。

所以,这是一个适当场景描述的破解:

 Scenario: An authenticated user invokes the add book dialog

仍然这个场景存在问题。也就是说,它仍然不是一个场景。这是在某些条件下采取的行动。就这样。我仍然不知道用户想要完成什么。

Scenario: An authenticated user adds a new book to the library database

现在我确切地知道用户是谁,用户想要完成什么,以及我们向该用户承诺的是:他将能够将新书添加到库数据库。

现在我知道我的测试必须证明:我(作为经过身份验证的用户)尝试添加的书实际上已添加到数据库中。现在,我可以像这样构建一个完整的场景:

Scenario: An authenticated user adds a new book to the library via the add book dialog
    Given I am an authenticated user
    And I have a new book to add to the database
    When I add the new book via the add book dialog
    Then the book info is displayed in the book list

您可以使用步骤定义来构建“通过添加书籍对话框添加新书”的可重用代码,或者检查“我是经过身份验证的用户”,或确保显示“书籍信息”。在该步骤代码中,您可以像您一样明确。

但是如果你使用Gherkin来测试输入字段验证,那么你就会测试错误的东西。如果要在显示对话框时测试输入字段是否为空,则应编写javascript(或php,或python或ruby)单元测试。如果要测试输入字段是否正确验证,则应编写单元测试。如果要测试对话框或灯箱的行为是否正确,则应编写功能测试。如果要测试这些字段中的数据是否正确存储在数据库中,则应编写功能集成测试。

但是如果你想测试你正在为用户做出的承诺,那么你应该写Gherkin。或者更确切地说,您的产品经理和您的Test Automator应该编写它。如果您的Test Automator试图用Gherkin编写单元测试,请告诉他他做错了。 :d

相关问题