1

语境

我对 .NET 比较陌生,并决定在项目中使用 BDD。我为此使用 Specflow。

我使用 Gherkin 格式创建了一个功能文件并生成了步骤定义。

我正在使用 Selenium 将我的功能文件中的表中的信息插入到网页中,并且我正在使用 MSTest 来测试结果。

我的步骤定义

[Binding]
public class RegisterSteps
{
    private IWebDriver ff = new FirefoxDriver();
    private string username = "";

    [Given(@"you are on the register page")]
    public void GivenYouAreOnTheRegisterPage()
    {         
        ff.Navigate().GoToUrl("http://localhost:55475/Register");
    }

    [Given(@"you enter the following information")]
    public void GivenYouEnterTheFollowingInformation(TechTalk.SpecFlow.Table table)
    {
        username = table.Rows[6]["Value"];
        for (var i = 0; i < table.RowCount; i++)
        {
            var field = table.Rows[i]["Field"];
            var value = table.Rows[i]["Value"];
            field = "mainContentPlaceHolder_TextBox" + field.Replace(" ", string.Empty);
            ff.FindElement(By.Id(field)).SendKeys(value);
        }
    }

    [When(@"you click submit")]
    public void WhenYouClickSubmit()
    {
        ff.FindElement(By.Id("mainContentPlaceHolder_Submit")).Click();
    }

    [Then(@"you should see the message ""(.*)""")]
    public void ThenYouShouldSeeTheMessage(string expectedMessage)
    {
        string message =  ff.FindElement(By.Id("mainContentPlaceHolder_LabelSuccess")).Text;
        Assert.AreEqual(message, expectedMessage);          
    }

    [Then(@"a record should be added to the table")]
    public void ThenARecordShouldBeAddedToTheTable()
    {
        RiskClassesDataContext db = new RiskClassesDataContext();
        var query = from ao in db.ActionOwners
                    where ao.username.Equals(username)
                    select ao;
        Assert.IsNotNull(query.First());
    }
}

问题

  1. 我希望能够在我的步骤定义中使用 Linq 来检查记录是否被插入到各种表中。上面的代码NullReferenceExceptionRiskClassesDataContext(). 我之前已经能够创建 RiskClassesDataContext 的实例,所以我想知道这是否是因为我试图从我的 Specflow 项目而不是从我的 Web 应用程序中执行此操作。

  2. 我的最后一个问题是您是否认为这是测试我的项目的最佳方法。带有数据库查询的 selenium 是否可以测试我的整个项目,或者我最好使用 Moq。或者两者兼而有之?

非常感谢

4

1 回答 1

1

简短的答案

  1. 我需要查看代码RiskClassesDataContext才能确定,但​​是是的,这很可能是因为您在连接到数据库时丢失了一些东西。
  2. 这种方法没有错,但如果它是最好的方法取决于你想要实现的目标。

长答案

为了决定这是否是最好的测试方式,你真的需要考虑你想要实现的测试类型。

  • 您是否正在尝试编写一些测试来帮助您编写代码?
  • 您想提供一个全面的测试库来证明您的代码是正确的吗?
  • 您的测试是否应该证明您的解决方案可以正常工作?

现在在这一点上,你可能会对自己说你想要所有这些,或者它们都是一样的,但实际上这里有一些微妙的不同。

  • 如果您想要一些测试只是为了帮助您编写代码,那么在编写代码之后阻止您丢弃这些测试的方法是什么。
  • 如果您想证明您的代码是正确的,那么您正在考虑单元测试,可能不关心与数据库对话,是的,Moq 将非常有用(其他模拟库可用)。
  • 如果您想证明您的解决方案有效,那么我们正在研究验收测试,您确实需要证明您的代码和数据库之间的交互。

这里的重点是 SpecFlow 可以用于所有这些事情。

如果您正在尝试正确地执行 BDD,那么实际上您已经与您的业务代表坐下来,并且在你们两人之间,您已经为您正在考虑实现的功能制定了许多方案。当然,您在考虑您的代码之前已经这样做了。这样我们就不会将我们的想法锁定在任何一种实现上 :-) 现在您可以坐下来实现您的绑定,以免它们失败。

但接下来呢?好吧,当然,此时我们想要编写一些新代码,并且由于我们是优秀的开发人员,因此我们使用 TDD 来帮助我们。由于我们是单元测试,所以我们使用 Mocks 来帮助我们隔离每个代码单元。这导致我们的代码不断发展,因此在编写了一些单元测试之后,我们的 SpecFlow 测试也通过了。

这导致我们将通过示例测试的规范用作定义我们的新功能的外部流程,而单元测试是推动代码走向成功的内部循环。双重红绿重构循环。此外,这意味着我们的 SpecFlow 测试范围更大,可能包括对该数据库的访问。

所以现在如果我们回到我们的问题

  • 您是否正在尝试编写一些测试来帮助您编写代码?
  • SpecFlow 可以是其中的一部分,但我也建议使用 TDD
  • 您想提供一个全面的测试库来证明您的代码是正确的吗?
  • 不要打扰 SpecFlow,只需使用 nUnit 和 mocks
  • 您的测试是否应该证明您的解决方案可以正常工作?
  • 这就是 SpecFlow 擅长的,如果它需要一个数据库,那就继续吧

试试这篇文章了解更多细节。

最后一点,如果您在测试中使用数据库,您必须考虑如何将其隔离以进行多次测试运行。查看using-specflow-for-wpf-in-mvvm了解更多关于此的想法

于 2013-03-21T00:27:27.520 回答