2017-05-18 5 views
3

こんにちは、再試行の回数をapp.config値から動的に渡したいと思います。NUnit再試行動的属性

のapp.configは、次の行があります

<add key="retryTest" value="3"/> 

をそして、私はこの変数を定義しています

​​

最後に、私はNUnitの属性を再試行するためのパラメータとしてその変数を渡したいと思います:

[Test, Retry(numberOfRetries)] 
public void Test() 
{ 
    //.... 
} 

ただし、次のエラーが発生します。

"An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type"

どのようにしてその値を動的に渡すことができますか?

+0

良い質問ですが、まずはtest- * data *を動的に注入できる 'TestCaseSource'属性でこれを行うことができたと思います。しかし、これはtest- * parameters *ではうまくいかないようです。ソースコードから、テストにパラメータを動的に追加する方法が見つかりませんでした。 – HimBromBeere

+0

RetryはTestAttributeのパラメータではなく、別の属性です。それがパラメータだった場合、構文は '[Test(Retry = 3)] !! !!無効です!! – Charlie

答えて

4

私はRetryAttributeを十分に理解していませんが、所望の機能性を達成する1つの可能な方法は、その現在の機能性を拡張することである。

/// <summary> 
/// RetryDynamicAttribute may be applied to test case in order 
/// to run it multiple times based on app setting. 
/// </summary> 
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] 
public class RetryDynamicAttribute : RetryAttribute { 
    private const int DEFAULT_TRIES = 1; 
    static Lazy<int> numberOfRetries = new Lazy<int>(() => { 
     int count = 0; 
     return int.TryParse(ConfigurationManager.AppSettings["retryTest"], out count) ? count : DEFAULT_TRIES; 
    }); 

    public RetryDynamicAttribute() : 
     base(numberOfRetries.Value) { 
    } 
} 

カスタム属性を適用します。

[Test] 
[RetryDynamic] 
public void Test() { 
    //.... 
} 
+2

これは最善の方法のようです。 – Charlie

+0

うまく動作します!ありがとうございました。しかし、それはタイムアウトエラーが発生したときに動作しないことに気付きました。それを更新する方法はありますか? – joudaon

0

周りの仕事のビット、しかし、あなたはTest(1)Test(2)Test(3)が表示されますテストエクスプローラでnumberOfRetries

[Test, TestCaseSource("GetNum")] 
public void Test(int testNum) 
{ 
} 

private IEnumerable GetNum 
{ 
    get 
    { 
     int numberOfRetries = int.Parse(ConfigurationManager.AppSettings["retryTest"]); 
     for (int i = 1; i <= numberOfRetries; ++i) 
     { 
      yield return new TestCaseData(i); 
     } 
    } 
} 

を実行するテストを駆動し、データを作成するためにTestCaseSource属性を使用することができます。

+0

mmmありがとうございますが、私はこのコードを動作させることができません... :( – joudaon

+0

@joudaon何が問題なのですか? – Guy

+0

賢い...再試行属性は実際に縮退したテストケースソースの一種です:-) – Charlie

関連する問題