2015-11-20 4 views
0

У меня много тестовых примеров, и они должны работать по-разному, в зависимости от их категории.
Пример:Отдельные множественные категоризированные тесты

[Test] 
[Category("Category1") 
[Category("Category2") 
private void DoSomething1() 
{ 
    if(((System.Collections.ArrayList) 
     TestContext.CurrentContext.Test.Properties["_CATEGORIES"]).Contains("Category2") 
    { 
     //Doing something specific by Category2 
    } 

    if(((System.Collections.ArrayList) 
     TestContext.CurrentContext.Test.Properties["_CATEGORIES"]).Contains("Category1") 
    { 
     //Doing something specific by Category1 
    }    
} 

Проблема заключается в том, что, когда я начать процесс тестирования с NUnit, выбирая category2, то DoSomething1 должен работать только category2 конкретный случай. Дублирование кода не является вариантом.

Как я мог это сделать?

+0

Вы не можете. Единственный способ сделать это - разделить их двумя способами. – ivamax9

+0

@Chase Вы полностью уверены? – recursiveContradiction

+0

Да, BTW, в идеологии Unit Tests вы ошибетесь, если продолжаете делать это, как хотите. – ivamax9

ответ

0

Кажется, что вы должны запускать это как два или более разных теста, так же, как @Chase упоминает в комментарии.

Когда я смотрю на ваш тест, как написано в вашем вопросе, мне сразу же приходит в голову, что это кажется сложным/неясным. Кажется, вы пытаетесь работать против того, как NUnit и модульное тестирование в целом работают и предназначены для работы.

По моему опыту, хороший юнит-тест - это тот, где мне почти не нужно вообще думать, чтобы понять, что он делает. Вышеприведенный пример может быть не очень сложным сам по себе, но, похоже, необычный, чтобы сделать это таким образом, и это может смутить будущих читателей, чего вы действительно хотите избежать в модульном тесте; поскольку цель состоит в том, чтобы проверить правильность вашего основного кода, сам тест должен быть как можно более простым, чтобы уменьшить вероятность ошибок в тесте до абсолютного минимума.

Из вашего кода, похоже, было бы логично просто дублировать ваш тест и использовать вместо него два отдельных теста.


PS: Если вы абсолютно хотите использовать общую логику для нескольких тестов, есть варианты, подобные следующим, которые должны ограничить то, что работает NUnit - но это трудно понять из вашего ограниченного примера или нет это имеет смысл в вашем конкретном случае:

[Test] 
[Category("Category1") 
private void DoSomethingForCat1() 
{ 
    TestSomeStuff("category1"); 
} 

[Test] 
[Category("Category2") 
private void DoSomethingForCat2() 
{ 
    TestSomeStuff("category2"); 
} 


private void TestSomeStuff(string category) 
{ 
    if(category == "Category1"){ 
     (...) 
    } 
    else if(category == "Category2"){ 
     (...) 
    } 
} 

Опять же, хотя это должно быть возможно, я бы не рекомендовал его; это кажется необычным и не очень чистым. Вы должны обязательно подумать о том, какое решение сделает ваши тесты наиболее ясными, когда вы решите, что делать.

Смежные вопросы