Методы модульного тестирования, что выход является входом другого - PullRequest
1 голос
/ 21 октября 2011

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

Например.

Скажем, я написал криптографический класс, который шифрует и дешифрует строки.

public class CryptoDummy
{
    public string Decrypt(string value)
    {
    }

    public string Encrypt(string value)
    {
    }
}

Как мне создать свой модульный тест, если расшифровка зависит от результата шифрования?

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

Итак, хорошо ли иметь несколько вызовов на тест и утверждать окончательные результаты, полученные методом, который я назвал последним?

public class CryptoDummyTest
{
    private static CryptoDummy _cryptoDummy;

    // Use ClassInitialize to run code before running the first test in the class
    [ClassInitialize]
    public static void MyClassInitialize(TestContext testContext)
    {
        _cryptoDummy = new CryptoDummy();
    }

    [TestMethod]
    public void Encrypt_should_return_ciphered_64string_when_passing_a_plaintext_value()
    {
        const string PLAINTEXT_VALUE = "anonymous@provider.com";

        string cipheredString = _cryptoDummy.Encrypt(PLAINTEXT_VALUE);

        Assert.IsTrue(cipheredString != PLAINTEXT_VALUE);
    }

    [TestMethod]
    public void Decrypt_should_return_plaintext_when_passing_a_ciphered_value()
    {
        const string PLAINTEXT_VALUE = "anonymous@provider.com";

        string cipheredString = _cryptoDummy.Encrypt(PLAINTEXT_VALUE);

        string plaintextString = _cryptoDummy.Decrypt(cipheredString);

        Assert.IsTrue(plaintextString == PLAINTEXT_VALUE);
    }
}

Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 21 октября 2011

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

[TestMethod]
public void Decrypt_should_return_plaintext_when_passing_a_ciphered_value()
{

    const string PLAINTEXT_VALUE = "anonymous@provider.com";

    string cipheredString = "sjkalsdfjasdljs"; // ciphered value captured

    string plaintextString = _cryptoDummy.Decrypt(cipheredString);

    Assert.IsTrue(plaintextString == PLAINTEXT_VALUE);
}
1 голос
/ 21 октября 2011

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

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

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

1 голос
/ 21 октября 2011

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

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