Как повторить попытку NUnit TestCase? - PullRequest
1 голос
/ 19 февраля 2020

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

    [TestCase(“Some parameter”, Category = “Test category”, TestName = “Name of test”, Description = “Description of test”)]
    public void SomeTestName(string browser) {
    //Test script
    }

Если бы я использовал [Test] вместо [TestCase], я мог бы просто добавить атрибут [Retry (1)], но как мне добиться такое же поведение с [TestCase]? Я уже взглянул на атрибут NUnit retry dynamici c , который имеет довольно аккуратное решение, но, к сожалению, он не действует, когда я пытаюсь применить его к [TestCase] ​​

1 Ответ

2 голосов
/ 19 февраля 2020

Согласно документам: «RetryAttribute используется в тестовом методе, чтобы указать, что он должен быть перезапущен в случае сбоя до максимального числа раз».

То есть аргумент не количество повторных попыток, как вы думаете, а общее количество попыток запустить тест и [Retry(1)] не имеет никакого эффекта, независимо от того, где вы его используете. Поскольку это может привести к путанице, я просто отредактировал эту страницу, чтобы выдать явное предупреждение.

Если бы вы попытались использовать RetryAttribute в классе, вы бы получили предупреждение компилятора, потому что оно может только быть использованы на методы. Однако в NUnit метод может представлять либо один тест, либо группу параметризованных тестов. В случае параметризованного теста атрибут в настоящее время не действует.

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

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

using System;
using NUnit.Framework.Interfaces;
using NUnit.Framework.Internal.Commands;

namespace NUnit.Framework
{
  [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]
  public class RetryTestCaseAttribute : TestCaseAttribute, IRepeatTest
  {
    // You may not need all these constructors, but use at least the first two
    public RetryTestCaseAttribute(params object[] arguments) : base(arguments) { }
    public RetryTestCaseAttribute(object arg) : base(arg) { }
    public RetryTestCaseAttribute(object arg1, object arg2) : base(arg1, arg2) { }
    public RetryTestCaseAttribute(object arg1, object arg2, object arg3) : base(arg1, arg2, arg3) { }

    public int MaxTries { get; set; }

    // Should work, because NUnit only calls through the interface
    // Otherwise, you would delegate to a `new` non-interface `Wrap` method.
    TestCommand ICommandWrapper.Wrap(TestCommand command)
    {
      return new RetryAttribute.RetryCommand(command, MaxTries);
    }
  }
}

Вы могли бы использовать это следующим образом

[RetryTestCase("some parameter", MaxTries=3)]
public void SomeTestName(string browser)
{
  // Your test code
}

Некоторые замечания по поводу вышеупомянутого:

  1. Я скомпилировал этот код, но не проверял его. Пожалуйста, оставьте комментарий, если вы попробуете его, особенно если он нуждается в модификациях.

  2. Код основан на некотором знании внутренних компонентов NUnit и может сломаться в будущем. Потребуется более всеобъемлющая реализация, чтобы сделать ее ориентированной на будущее. В частности, я использовал тот факт, что IRepeatTest основан на ICommandWrapper, но не добавляет методов. Я считаю, что каждый из двух интерфейсов нужен там, где я их размещаю, потому что NUnit проверяет их в разных точках своего кода.

  3. Этот код примерно в три раза больше строк кода по сравнению с что нужно было бы добавить количество повторов к TestCaseAttribute! Спросите NUnit Project, хотите ли вы эту функцию - или добавьте ее сами!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...