MsTest - выполнение метода перед каждым тестом в сборке - PullRequest
32 голосов
/ 12 марта 2009

Можно ли запускать определенный метод перед каждым тестом в сборке?

Я знаю об атрибуте TestInitialize, но этот атрибут имеет "область видимости класса". Если он определен в классе Test, он будет выполняться перед каждым тестом из этого класса.

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

Ответы [ 5 ]

60 голосов
/ 13 марта 2009

[TestInitialize()] - это то, что вам нужно.

private string dir;

[TestInitialize()]
public void Startup()
{
    dir = Path.GetTempFileName();
    MakeDirectory(ssDir);
}

[TestCleanup()]
public void Cleanup()
{
    ss = null;
    Directory.SetCurrentDirectory(Path.GetTempPath());

    setAttributesNormal(new DirectoryInfo(ssDir));
    Directory.Delete(ssDir, true);
}


[TestMethod]
public void TestAddFile()
{
    File.WriteAllText(dir + "a", "This is a file");
    ss.AddFile("a");
    ...
}

[TestMethod]
public void TestAddFolder()
{
    ss.CreateFolder("a/");
    ...
}

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

15 голосов
/ 27 февраля 2011

Вы хотите использовать [AssemblyInitialize].

См .: MSDN Link

или этот вопрос: при переполнении стека

15 голосов
/ 13 марта 2009

Я не уверен, что эта функция возможна в MsTest из коробки, как в других тестовых средах (например, MbUnit).

Если мне нужно использовать MsTest, то я решаю это путем определения абстрактного класса TestBase с атрибутом [TestInitialize], и ​​каждый тест, для которого необходимо это поведение, происходит из этого базового класса. В вашем случае каждый тестовый класс в вашей сборке должен наследоваться от этой базы ...

И, возможно, есть другое решение, вы можете сделать свой собственный атрибут теста - но я еще не пробовал это ...:)

1 голос
/ 12 марта 2009

Ну, разве MSTest не создает экземпляр класса для каждого теста? Это было мое понимание этого. В таком случае все, что вы вызываете из своего конструктора, является кодом инициализации (для каждого теста по определению).

РЕДАКТИРОВАТЬ: Если это не сработает (что я все еще думаю, что должно, потому что MSTest должен убедиться, что отдельные тесты выполняются изолированно), тогда TestInitialize это ваш атрибут. Кстати, лучшее сравнение юнит-тестов доступно на Ссылка на Codeplex

0 голосов
/ 12 марта 2009

Я думаю, вы ищете атрибут ClassInitialize.

...