Модульное тестирование MSTest проходит само по себе, не проходит при запуске других тестов - PullRequest
5 голосов
/ 07 июня 2010

У меня проблемы с некоторыми модульными тестами MSTest, которые проходят, когда я запускаю их по отдельности, но не выполняются, когда я запускаю весь класс модульных тестов. Тесты проверяют некоторый код, который SLaks помог мне с более ранним , и он предупредил меня, что я делаю не поточно-ориентированно. Однако теперь мой код стал более сложным, и я не знаю, как сделать его потокобезопасным. Вот что у меня есть:

public static class DLLConfig
{
    private static string _domain;

    public static string Domain
    {
        get
        {
            return _domain = AlwaysReadFromFile
                ? readCredentialFromFile(DOMAIN_TAG)
                : _domain ?? readCredentialFromFile(DOMAIN_TAG);
        }
    }
}

И мой тест прост:

string expected = "the value I know exists in the file";
string actual = DLLConfig.Domain;
Assert.AreEqual(expected, actual);

Когда я запускаю этот тест самостоятельно, он проходит. Когда я запускаю его вместе со всеми другими тестами в классе тестов (которые выполняют аналогичные проверки для различных свойств), actual равен null, и тест не пройден. Я отмечаю, что это не проблема со свойством, тип которого является пользовательским типом Enum; может быть у меня эта проблема со свойством Domain, потому что это string? Или, может быть, это многопоточная проблема с тем, как работает MSTest?

Ответы [ 3 ]

6 голосов
/ 07 июня 2010

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

5 голосов
/ 07 июня 2010

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

public static string Domain
{
    get
    {
        return _domain = AlwaysReadFromFile
            ? CredentialReader.Read(DOMAIN_TAG)
            : _domain ?? CredentialReader.Read(DOMAIN_TAG);
    }
}

Затем вы можете инициализировать DllConfig с помощью CredentialReader, в котором вы можете управлятьвозвращаемое значениеПомните, что вы проверяете, что DLLConfig.Domain возвращает правильное значение на основе условия AlwaysReadFromFile.Вам не следует одновременно проверять, откуда поступает это значение (или если оно вообще существует).

Делая ваш класс DLLConfig более "тестируемым", вы получаете дополнительное преимущество, заключающееся в выделении проблем.Когда вы думаете о классе и не можете не сказать: «Этот класс делает this AND that » (абстрагирование данных конфигурации и чтение этих данных изЭто хорошая ставка, что класс смешивает проблемы и пытается сделать многое.Если DLLConfig является абстракцией данных конфигурации, она должна сосредоточиться только на этом и оставить там, откуда данные поступают в другой класс.

1 голос
/ 09 апреля 2014

Если ни один из приведенных выше ответов не сработал для вас, я решил эту проблему, добавив Thread.Sleep(1) перед утверждением в неудачном тесте ...

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

...