データ駆動型テストとSpecFlow

SpecFlowを使用すると、データドリブンシナリオに埋め込みテーブルを使用できます。 私の練習では、このアプローチで2つの問題に遭遇しました。

  1. 逆に、テストから自動ドキュメントを取得したい場合があります(たとえば、APIテスト)
  2. データ量が多い場合は、どこか別の場所に保存することをお勧めします(多くの場合、Excelは受け入れテストケースを使用します)


Gesignerが生成したコードを調べてみると、両方の問題を解決できました。



DSLを使用しないテストの基本クラスを書きましょう



[TestFixture] public class DslGenerationTestsBase : TestsBase { private static ITestRunner _testRunner; [TestFixtureSetUp] public virtual void FeatureSetup() { _testRunner = TestRunnerManager.GetTestRunner(); var features = GetType().GetCustomAttributes(typeof (FeatureAttribute), false); if (!features.Any()) { throw new ConfigurationErrorsException("Feature Attribute is required"); } var feature = (FeatureAttribute)features.Single(); var featureInfo = new FeatureInfo( new System.Globalization.CultureInfo("en-US"), feature.Title, feature.Story, ProgrammingLanguage.CSharp, null); _testRunner.OnFeatureStart(featureInfo); } [TestFixtureTearDown] public virtual void FeatureTearDown() { _testRunner.OnFeatureEnd(); _testRunner = null; } [TearDown] public virtual void TearDown() { _testRunner.OnScenarioEnd(); } protected void ScenarioSetup(ScenarioInfo scenarioInfo) { _testRunner.OnScenarioStart(scenarioInfo); } protected void ScenarioCleanup() { _testRunner.CollectScenarioErrors(); } protected void Given(string given, string keyword = "Given ") { _testRunner.Given(given, null, null, keyword); } protected void When(string when, string keyword = "When ") { _testRunner.When(when, null, null, keyword); } protected void Then(string then, string keyword = "Then ") { _testRunner.Then(then, null, null, keyword); } }
      
      





Featureを宣言スタイルで記述するために、独自の属性を記述します。 NUnitを使用します。 レポートにフィーチャーを表示するには、DescriptionAttributeを使用する必要があります。 したがって、属性を継承します。



 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)] public class FeatureAttribute : DescriptionAttribute { public string Title { get; private set; } public string Story { get; private set; } public CultureInfo CultureInfo { get; private set; } public FeatureAttribute(string title, string story):base(title) { Title = title; Story = story; CultureInfo = new CultureInfo("en-US"); } public FeatureAttribute(string title, string story, CultureInfo cultureInfo) : base(title) { Title = title; Story = story; CultureInfo = cultureInfo; } }
      
      





そして、テストでクラスを書きます



TestCaseの代わりに、TestCaseSourceを使用して、任意のソースからデータを読み取ることができます。



 [Binding] [Feature("DslGeneration", "In order to avoid silly mistakes\n" + "As a math idiot\n" + "I want to be told the sum of two numbers")] [Category("Examples")] public class DataDrivenDslGenerationExample : DslGenerationTestsBase { private decimal _a; private decimal _b; [TestCase("1", "2", "3")] [TestCase("2", "3", "5")] public void CodeSomeTest_DslIsGenerated(string a, string b, string c) { var scenarioInfo = new ScenarioInfo("DslGeneration Outline", null); ScenarioSetup(scenarioInfo); Given("Calculator is on"); When(string.Format("User fill {0} and {1}", a, b)); Then(string.Format("{0} is returned", c)); ScenarioCleanup(); } [Given(@"Calculator is on")] public void CalculatorIsOn() { } [When(@"User fill (.*) and (.*)")] public void Fill(int a, int b) { _a = a; _b = b; } [Then(@"(.*) is returned")] public void ResultReturned(int c) { var actual = _a + _b; Assert.AreEqual(c, actual); } }
      
      





基本クラスが別のアセンブリにある場合は、構成に追加する必要があります。

 <specFlow> <stepAssemblies> <stepAssembly assembly="..." /> </stepAssemblies> <!-- For additional details on SpecFlow configuration options see http://go.specflow.org/doc-config --> </specFlow>
      
      





以上で、SpecFlow.exeを使用して美しいレポートを生成できます







これにより、大量のデータを含むAPIおよびスクリプトの自動ドキュメントを作成できます。



All Articles