2017-05-18 1 views
3

안녕하세요, app.config 값에서 동적으로 재시도 횟수를 전달하고 싶습니다.NUnit 동적 속성을 다시 시도하십시오.

의 app.config 다음 줄이 있습니다

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

을 그리고 난이 변수 정의 :

public static readonly int numberOfRetries = int.Parse(ConfigurationManager.AppSettings["retryTest"]); 

마지막으로 내가 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을 완전히 알고 있지 않지만. 원하는 기능을 달성 할 수있는 한 가지 방법은 현재 기능을 확장하는 것입니다.

/// <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

관련 문제