2016年8月7日日曜日

SpecFlow 実行中の試験の情報を取得するContext

Context

SpecFlow実行時に、実行中のフィーチャ/シナリオの情報を取得するための各種オブジェクト。
試験実行時の細かいログ取得、Hook実行時に、実行中の試験の情報を取得するなどの用途に役立つ。

Contextの一覧

  • FeatureContext
  • ScenarioContext
  • ScenarioStepContext

各種Context は、それぞれ、有効範囲がある。有効ではないタイミングだと、正しい情報は取得できない。

各Context有効範囲一覧

No.
Hookイベント
Feature
Context
Scenario
Context
ScenarioStep
Context
1
[BeforeTestRun]
---
2
[BeforeFeature]
O
--
3
[BeforeScenario]
O
O
-
4
[BeforeScenarioBlock]
O
O
-
5
[BeforeStep]
O
O
O
6
(各ステップ実行中)
O
O
O
7
[AfterStep]
O
O
O
8
[AfterScenarioBlock]
O
O
-
9
[AfterScenario]
O
O
-
10
[AfterFeature]
O
--
11
[AfterTestRun]
---


有効範囲と値の取得のサンプル

前記した有効範囲の一覧を確認できるサンプル。

コード例:
[Binding]
public sealed class Hooks
{
   private static void OutputContextInfo(string eventName)
   {
       System.Console.WriteLine( eventName + ":" +
             (FeatureContext.Current != null ? FeatureContext.Current.FeatureInfo.Title : null) + " , "
           + (ScenarioContext.Current != null ? ScenarioContext.Current.ScenarioInfo.Title : null) + " , "
           + (ScenarioStepContext.Current != null ? ScenarioStepContext.Current.StepInfo.Text : null));
   }

   [BeforeTestRun]
   public static void DoBeforeTestRun()
   {
       Hooks.OutputContextInfo("Before Test Run");
   }

   [AfterTestRun]
   public static void DoAfterTestRun()
   {
       Hooks.OutputContextInfo("After Test Run");
   }

   [BeforeFeature]
   public static void DoBeforeFeature()
   {
       Hooks.OutputContextInfo("Before Feature");
   }

   [AfterFeature]
   public static void DoAfterFeature()
   {
       Hooks.OutputContextInfo("After Feature");
   }

   [BeforeScenario]
   public void DoBeforeScenario()
   {
       Hooks.OutputContextInfo("Before Scenario");
   }

   [AfterScenario]
   public void DoAfterScenario()
   {
       Hooks.OutputContextInfo("After Scenario");
   }

   [BeforeScenarioBlock]
   public void DoBeforeSB()
   {
       Hooks.OutputContextInfo("Before Scenario Block");
   }

   [AfterScenarioBlock]
   public void DoAfterSB()
   {
       Hooks.OutputContextInfo("After Scenario Block");
   }
   [BeforeStep]
   public void DoBeforeStep()
   {
       Hooks.OutputContextInfo("Before Step");
   }

   [AfterStep]
   public void DoAfterStep()
   {
       Hooks.OutputContextInfo("After Step");
   }
}

    上記コードの実行で、大体はどこでどの情報が設定されるのかが確認できるはず。

各Contextから取得できる情報

各Contextから取得できる情報の一覧を示す。

FeatureContext

変数名
説明
FeatureContext
Current
実行時のFeatureContextオブジェクトを戻す。
CultureInfo
CultureInfo
実行時のカルチャー。設定ファイルに指定された言語。(なければフィーチャファイルの言語と一致)
FeatureInfo
FeatureInfo
後述。フィーチャの情報を取得するオブジェクト。

FueatureInfo

FeatureContext.Current.FeatureInfo で取得するオブジェクトから取得できる情報。
変数名
説明
string[]
Tags
フィーチャに関連付けられたタグの文字列。フィーチャに着けられたタグの数だけ配列の要素が存在する。
ProgrammingLanguage
GenerationTargetLanguage
実行時のプログラミング言語。enum。
string
Title
フィーチャの機能名。
string
Description
フィーチャファイルで、機能名に続く複数行の説明。
CultureInfo
Language
フィーチャファイルの記載言語。

※ ProgrammingLanguage に設定される値の一覧は、以下の通り
  • Other    0
  • CSharp    1
  • VB    2
  • FSharp    3

ScenarioContext

変数名
説明
ScenarioContext
Current
実行時のScenarioContextオブジェクトを戻す。
ScenarioInfo
ScenarioInfo
実行中のシナリオのタグとタイトル。
ScenarioBlock
CurrentScenarioBlock
現在実行中のシナリオの種類。種類は後述。
Exception
TestError
ステップ実行時に例外が発生した場合に、発生した例外が設定されている。

ScenarioInfo

ScenarioContext.Current.ScenarioInfo で取得するオブジェクトから取得できる情報。

変数名
説明
string[]
Tags
シナリオに設定されたタグ。複数設定されていれば、複数。
string
Title
シナリオのタイトル。

ScenarioBlock に設定される値について
現在実行中のステップに対応するシナリオブロックに応じて、以下いずれかの値が設定されている。
  • None    0
  • Given    1
  • When    2
  • Then    3
(ScenarioBlockが、"None"になるのは、最初のステップを実行する前と、最後のステップを実行し終わった後の間のみ)

ScenarioStepContext

変数名
説明
ScenarioStepContext
Current
実行時のScenarioStepContextオブジェクトを戻す。
StepInfo
StepInfo
実行中のステップの情報。詳細は後述。


StepInfo

ScenarioStepContext.Current.StepInfo で取得するオブジェクトから取得できる情報。ステップの記載内容、引数の中身を持つ。
変数名
説明
StepDefinitionType
StepDefinitionType
実行しているStepの種類
string
Text
ステップで実行中の中身
Table
Table
引数のテーブル
string
MultilineText
フィーチャファイルで、"""で囲まれた複数行の文字列。
StepDefinitionType に設定される値について
現在実行中のステップの種類応じて、以下いずれかの値が設定されている。
  • Given    1
  • When    2
  • Then    3

共通した機能を記載する際、何かを共通化したい場合などに、Hookと共に、使用を検討するのが良いと思われる。

以上。

0 件のコメント:

コメントを投稿