2015-01-26 2 views
1

Я пишу код, который будет выполнять серию тестовых шагов, эти тестовые шаги будут выровнены, чтобы проверить шаги вручную захваченные в тесте, вот пример:аккуратнее способ реализации «количество шагов»

enter image description here

На приведенном выше снимке экрана показаны три шага для образца тестового примера (это просматривается с помощью Microsoft Test Manager).

Просьба также иметь в виду, что это примитивный пример, упрощенный для этого вопроса, на самом деле это не редкость иметь 50 этапов тестирования и значительно более сложные сценарии, также я пропустил код очистки и ввода в приведенной ниже функции ,

Теперь код, который работает это выглядит примерно так: (Обратите внимание на механизм попытка/улова, который позволяет тест на неудачу на определенном этапе):

[TestMethod] 
     public void LinksPageOpensFromClick() 
     { 
      int step = 0; 

      try 
      { 
      step++; 
      // Code to Open the page 
      } 
      catch (Exception ex) 
      { 
      Assert.Fail(AppManager.RaiseError(step, "Open the page", ex)); 
      } 

      try 
      { 
       step++; 
      // Code to Click links button 
      } 
      catch (Exception ex) 
      { 
      Assert.Fail(AppManager.RaiseError(step, "Click links button", ex)); 
      } 

      try 
      { 
      step++; 
      // Code to Assert links page opened 
      } 
      catch (Exception ex) 
      { 
      Assert.Fail(AppManager.RaiseError(step, "Assert links page opened ", ex)); 
      } 
     } 

Первое наблюдение, я использовал чтобы просто жесткий код в значении шага, как это:

Assert.Fail(AppManager.RaiseError(3, "Assert links page opened ", ex)); 

Но это означает, что в случае изменения тест позже, и тестовые шаги добавлены или заказана, это означает, что изменения вручную огромное количество шагов.

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

То, что я действительно искал это решение так:

[StepDesc="Assert links page opened"] 
Step 
{ 
    // Code to exec 
} 
Error (Exception ex) 
{ 
    Assert.Fail(AppManager.RaiseError(Step.Count, Step.Desc, ex)); 
} 

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

Заранее спасибо.

РЕДАКТИРОВАТЬ: Также, если C# не может справиться с этим, возможно, я мог бы поставить все свои передние экзамены в другом проекте, который может быть не C#, но совместим с MSIL?

+0

Это может быть лучший вопрос для обзора кода.что вы могли бы хранить «Словарь » с № шага к тексту ошибки – DLeh

+0

, вы также можете создавать методы для каждого шага вместо одного гигантского метода. – DLeh

+0

DLeh, приятное предложение, но тогда вам все равно придется бросать эту ошибку с ручным указателем в блоке catch. –

ответ

2

Если шаги вручную реализованы (а не, например, автоматически сгенерированы из формального описания, в этом случае Groo's solution, что определяет Step класса действительно лучше), это, вероятно, как я хотел бы сделать это, так как это, кажется, самым простым способом, и, по крайней мере, если код каждого из единого шага прост, я также найти более читаемый:

public class Stepper 
{ 
    private int StepNumber { get; set; } 

    public void Step(string description, Action code) 
    { 
     StepNumber++; 
     try 
     { 
      code(); 
     } 
     catch (Exception ex) 
     { 
      Assert.Fail(AppManager.RaiseError(StepNumber, description, ex)); 
     } 
    } 
} 

Тогда тест код будет выглядеть так:

var stepper = new Stepper(); 

stepper.Step("Open the page",() => { /* code to open the page */ }); 
stepper.Step("Click links button",() => { /* code to click links button */ }); 

// etc. 

Одна вещь, которая может или не может быть интересно для вас, что вы могли бы довольно легко реализовать способ создания вложенных шагов, например, что-то вроде

var stepper = new Stepper(); 

stepper.Step("Foo the bar",() => { /* ... */ }); 

using (var substep = stepper.SubStep("baz all the quuxs")) 
{ 
    substep.Step("baz the first quux",() => { /* ... */ }); 
    substep.Step("baz the second quux",() => { /* ... */ }); 
} 

stepper.Step("cleanup",() => { /* ... */ }); 
+0

На самом деле это решение, с которым я пошел - и я сделал небольшую настройку -> на публичном шаге void добавил [DebuggerStepThrough], таким образом, я могу f11 войти в фактический код, не пройдя по методу шагов:) Очень хорошая работа - и спасибо. –

4

Это, очевидно, нужно идти в цикле, то есть что-то вроде:

class Step 
{ 
    public string Name { get; set; } 
    public Action Action { get; set; } 
} 

var steps = new [] 
{ 
    new Step() { Name = "Open the page", Action = OpenThePageStep }, 
    new Step() { Name = "Click links button", Action = ClickLinksBtnStep }, 
    ... 
}; 

... 

var id = 0; // or the Step class itself should have an id? 
foreach (var step in steps) 
{ 
    try 
    { 
     id++; 
     step.Action(); 
    } 
    catch (Exception ex) 
    { 
     Assert.Fail(AppManager.RaiseError(id, step.Name, ex)); 
    } 
} 
+1

Похоже, я немного опаздываю к игре; удалил мой ответ. +1 –

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