Как запустить один и тот же метод испытаний, изменяя только зависимости? - PullRequest
4 голосов
/ 23 января 2010

У меня есть 5 методов тестирования, которые проверяют функциональность объекта PasswordManager. Я использую встроенный механизм тестирования Visual Studio 2008. Этот менеджер может использовать две зависимости: XMLStorageManager или DbStorageManager. Зависимость устанавливается в конструкторе Passwordmanager. Как я могу запустить тесты дважды, с той лишь разницей, какой тип StorageManager я использую?

(Я знаю, я знаю, это НЕ юнит-тесты ...)

Ответы [ 3 ]

5 голосов
/ 23 января 2010

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

Шаги:

  • Определите абстрактный базовый класс с помощью все тесты в нем
  • положить в абстрактный метод называется CreateStorageManager (), который возвращает IStorageManager (или любой другой сопрягать две зависимости реализовать)
  • Подкласс прибора дважды и обеспечить реализацию CreateStorageManager (), который возвращает конкретный тип, который вы хотите использовать для запуска тестов.

Вот код для эквивалентной версии NUnit; Я уверен, что вы можете экстраполировать. Примечание: Правила наследования для MSTest могут немного отличаться от того, к чему я привык. Если это не сработает, попробуйте пометить базовый класс как тестовое устройство.

public abstract class PasswordManagerFixtureBase
{
     protected abstract IStorageManager CreateStorageManager();

     // all tests go in this fixture
     [Test]
     public void SomeTestOrOther()
     { 
         var passwordManager = CreatePasswordManager();

         // do test logic

     }

     private PasswordManager CreatePasswordManager()
     { 
          // calls into subclass implementation to get instance of storage
          IStorageManager storage = CreateStorageManager();
          return new PasswordManager(storage);
     }   
}

// Runs the tests in the fixture base using XmlStorageManager
[TestFixture]
public class PasswordManager_XMLStorageManagerImplTests
{
      protected override IStorageManager CreateStorageManager()
      {
          return new XMLStorageManager();
      }
}

// Runs the tests in the fixture base using DbStorageManager
[TestFixture]
public class PasswordManager_DbStorageManagerImplTests
{
      protected override IStorageManager CreateStorageManager()
      {
          return new DbStorageManager();
      }
}

Может быть более элегантный способ сделать это с помощью MSTest, но это должно сработать.

1 голос
/ 26 февраля 2010

Если у PasswordManager есть зависимость типа IStorageManager, которая вводится (DI, IoC и т. Д.), То может быть достаточно смоделировать этот интерфейс вместо использования конкретной реализации, поэтому нет необходимости тестировать PasswordManager для реализаций XML и Db, которые можно протестировать отдельно от PasswordManager.

0 голосов
/ 23 января 2010

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

...