1

環境

私は .NET に比較的慣れていないので、プロジェクトで BDD を使用することにしました。これにはSpecflowを使用しています。

Gherkin 形式を使用して機能ファイルを作成し、ステップ定義を生成しました。

Selenium を使用して機能ファイルのテーブルから Web ページに情報を挿入し、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 を使用して、レコードがさまざまなテーブルに挿入されていることを確認できるようにしたいと考えていました。上記のコードはNullReferenceException、 のコンストラクターで をスローしていRiskClassesDataContext()ます。以前は RiskClassesDataContext のインスタンスを作成できたので、Web アプリケーション内からではなく、Specflow プロジェクトからこれを実行しようとしているからではないかと考えています。

  2. 最後の質問は、これが私のプロジェクトをテストするための最良のアプローチだと思うかどうかです。データベースクエリを使用したセレンは、プロジェクト全体をテストするのに問題ありませんか、それとも Moq を使用したほうがよいでしょうか。それとも両方?

どうもありがとう

4

1 に答える 1

1

短い答え

  1. 確かにのコードを確認する必要がありますRiskClassesDataContextが、そうです、データベースに接続するときに何かが不足している可能性が最も高いです。
  2. このアプローチに問題はありませんが、それが最善のアプローチである場合、何を達成したいかによって異なります。

長い答え

これがテストの最良の方法であるかどうかを判断するには、どのタイプのテストを達成しようとしているのかを実際に検討する必要があります。

  • コードを書くのに役立つテストを書こうとしていますか?
  • コードが正しいことを証明するための包括的なテスト ライブラリを作成しますか?
  • テストでソリューションが正しく機能することを証明する必要がありますか?

この時点で、すべてが欲しい、またはすべて同じであると自分に言い聞かせているかもしれませんが、実際には、ここで微妙に異なるものがいくつかあります.

  • コードを書くのに役立つだけのテストが必要な場合、コードが書かれた後にそれらのテストを捨てるのを止めるにはどうすればよいでしょうか。
  • コードが正しいことを証明したい場合は、単体テストを考えており、おそらくデータベースとの対話は気にしません。そうです、Moq は本当に便利です (他のモック ライブラリが利用可能です)。
  • ソリューションが機能することを証明したい場合は、受け入れテストを検討しており、コードとデータベース間の相互作用を実際に証明する必要があります.

ここでのポイントは、SpecFlow はこれらすべてに使用できるということです。

BDD を適切に実行しようとしている場合は、実際にビジネス担当者と話し合って、実装を考えている機能のシナリオをいくつか考え出しています。もちろん、コードについて考える前にそれを行っています。私たちの考えを特定の実装に固定しないように:-) これで、失敗するようにバインディングを実装することができます。

しかし、次は何ですか?もちろん、この時点で新しいコードを書きたいと思っています。私たちは優れた開発者であるため、TDD を使用して支援します。また、単体テストを行っているため、コードの各単位を分離するためにモックを使用しています。これによりコードが進化し、いくつかの単体テストを記述した後、SpecFlow テストもパスするようになります。

これにより、例による仕様テストを新しい機能を定義する外部プロセスとして使用し、単体テストをそのコードを成功に導く内部ループとして使用することになります。二重の赤緑リファクタリング サイクル。さらに、SpecFlow テストの範囲が大きく、そのデータベースへのアクセスが含まれる可能性があることを意味します。

では、質問に戻ると

  • コードを書くのに役立つテストを書こうとしていますか?
  • SpecFlow はその一部ですが、TDD も使用することをお勧めします。
  • コードが正しいことを証明するための包括的なテスト ライブラリを作成しますか?
  • SpecFlow を気にせず、nUnit とモックを使用してください
  • テストでソリューションが正しく機能することを証明する必要がありますか?
  • これが SpecFlow の得意とするところです。データベースが必要な場合は、先に進んでください。

詳細については、この記事をお試しください。

最後のポイントとして、テストでデータベースを使用する場合、複数のテスト実行のためにデータベースを分離しておく方法を検討する必要があります。これに関する詳細については、using-specflow-for-wpf-in-mvvmをご覧ください。

于 2013-03-21T00:27:27.520 に答える