Модульное тестирование C #: Почему ожидаемый результат должен быть включен в название теста? - PullRequest
3 голосов
/ 23 ноября 2010

Если ожидаемый результат тестируемого метода существует в официальной документации метода, то указание ожидаемого результата в названиях тестов будет излишним.Фактически, если цель состоит в том, чтобы документировать метод, тогда документация должна быть записана в XML-документации метода, которая предоставит информацию Intellisense и т. Д.

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

Ответы [ 7 ]

3 голосов
/ 23 ноября 2010

Это вопрос соглашения и практики развития. Если вы используете TDD, документирование ожидаемого результата в названии теста поможет вам сосредоточиться на своей цели. Также нет документов XML для указания ожидаемого результата, поскольку вы еще не реализовали этот класс. (Сначала вы пишете тест.) Дополнительным преимуществом здесь является то, что документирование ожидаемого результата в тесте означает, что вы можете выполнить спецификацию (или тест) и убедиться, что она верна. Вы не можете выполнить XML документы. :) (Тем не менее, необходимо убедиться, что имя теста и код теста совпадают. Это проще, чем проверка соответствия кода теста и документов XML в другом файле.)

Помимо этого, есть инструменты, которые извлекают имена классов / методов и генерируют для вас документы спецификации в HTML. Это позволяет легко создавать отчеты, которые могут быть просмотрены всеми заинтересованными сторонами. Вы хотели бы сделать это для высокоуровневых тестов / спецификаций, таких как «Когда во время оформления заказа применяется 10-процентный скидочный код для одного товара, самый дорогой товар в корзине скидок на 10%». Это позволяет заинтересованным сторонам проверить (потому что спецификации выполняются / передаются), что система реализует определенные бизнес-функции.

1 голос
/ 23 ноября 2010

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

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

0 голосов
/ 18 ноября 2014

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

Допустим, у меня есть следующий класс для тестирования:

public class ColorParser {
    public static bool TryParseHex(string value, out Color color) {
        // Code to parse the hex color value.
    }
}

MyМодульные тесты для этого конкретного метода выглядят следующим образом:

public class ColorParserTests
{
    public class TryParseHexTests
    {
        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException))]
        public void TestNullValue()
        {
            Color color = Color.Empty;
            ColorParser.TryParseHex(null, out color);
        }

        [TestMethod]
        [ExpectedException(typeof(ArgumentNullException))]
        public void TestEmptyValue()
        {
            Color color = Color.Empty;
            ColorParser.TryParseHex(string.Empty, out color);
        }

        [TestMethod]
        public void TestInvalidValues()
        {
            string[] invalidValues = new string[] 
            { 
                "#",
                "FF",
                "#FF",
                "#FFAA",
                "asdf"
            };
            foreach (var invalidValue in invalidValues)
            {
                Color color = Color.Empty;
                bool result = ColorParser.TryParseHex(invalidValue, out color);
                Assert.IsFalse(result, string.Format("Value '{0}' must not pass the test!", invalidValue));
            }
        }

        [TestMethod]
        public void TestValidValues()
        {
            // Spaces are intended and a part of the test!
            Dictionary<string, Color> validValues = new Dictionary<string, Color>() 
            { 
                {"      #000000", Color.FromArgb(0,0,0)},
                {" #010203  ", Color.FromArgb(1,2,3)},
                {"#00FFFF", Color.FromArgb(0,255,255)},
                {"#FF00FFFF", Color.FromArgb(255,0,255,255)},
            };
            foreach (var validValue in validValues)
            {
                Color color = Color.Empty;
                bool result = ColorParser.TryParseHex(validValue.Key, out color);
                Assert.IsTrue(result, string.Format("Value '{0}' must pass the test!", validValue.Key));
                Assert.AreEqual(validValue.Value, color, "Parsed color must be the same.");
            }
        }
    }
}

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

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

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

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

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

Потому что PoppingEmptyStackThrowsInvalidOperationException() гораздо проще понять, если смотреть на бегуна, чем StackPopTest_1()

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

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

MyMethod_Zero()
MyMethod_MinValue()
MyMethod_MaxValue()
MyMethod_SomeBranchTest()

и т.д.

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

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

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

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

Я всегда думал, что если что-то не соответствует вашим потребностям, не используйте это / исправьте это, чтобы соответствовать вашим потребностям.Единственное логичное объяснение, которое я могу придумать, заключается в том, что после запуска тестовых методов вы можете экспортировать запись прохождения / неудачи и передать ее менеджерам, чтобы у них была улыбка на лице, потому что я не знаю, почему они такие серьезные:) .. Шутки друг от друга .. еще одна причина, почему BDD медленно, но верно набирает обороты.

...