Как я могу определить название моего модульного теста перед его выполнением? - PullRequest
0 голосов
/ 04 июля 2011

Я использовал MSTest и все было хорошо.Не так давно мне нужно было написать большое количество управляемых данными модульных тестов.

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

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

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

Кто-то предложил мне "проверить NUnit".Я совершенно ничего не понимаю о NUnit.Сейчас я начал читать его документацию, но все еще в растерянности.Есть ли у вас совет?

Ответы [ 3 ]

1 голос
/ 05 июля 2011

Если вам действительно нужно название теста - он плохо документирован, но NUnit предоставляет функцию, позволяющую получить доступ к текущей информации теста:

namespace NUnitOutput.Example
{
  using NUnit.Framework;

  [TestFixture]
  public class Demo
  {
      [Test]
      public void WhatsMyName()
      {
          Console.WriteLine(TestContext.CurrentContext.Test.FullName);
          Console.WriteLine(TestContext.CurrentContext.Test.Name);
      }
  }
}

Обеспечивает:

NUnitOutput.Example.Demo.WhatsMyName
WhatsMyName

Обратите внимание, что эта функция не гарантируется для пользовательских TestRunners, таких как ReSharper. Я проверил это в NUnit 2.5.9 (nunit.exe и nunit-console.exe)

Однако, перечитывая ваш вопрос, я думаю, вы должны проверить это атрибут TestCaseSource или TestCase , который можно использовать параметризовать ваши тесты.

0 голосов
/ 04 июля 2011

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

Самый простой способ, который работает в (любой) среде тестирования, - это создать прибор, который загружает любые данные с помощью идентификатора данных (строка). Затем в каждом тестовом примере вы просто предоставляете строку теста для поиска данных, которые вы хотите получить в этом тесте.

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

0 голосов
/ 04 июля 2011

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

Если это так, то я не думаю, что вам нужно искать специальные функциональные возможности в вашей структуре модульного тестирования.Почему бы не использовать API Reflection для получения имени выполняемого в настоящее время метода?System.Reflection.MethodBase.GetCurrentMethod() даст вам объект MethodBase, представляющий метод, который имеет свойство Name.

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

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

...