Как Assert.AreEqual определяет равенство между двумя общими IEnumerables?
У меня есть модульный тест, чтобы проверить, возвращает ли метод правильный файл IEnumerable . Метод строит перечисляемое с использованием yield return . Класс, который является перечислимым, приведен ниже:
Это соответствующая часть метода:
Если я сохраню результат этого метода в actual , сделаю еще один перечислимый expected и сравним их вот так.
. утверждение не выполняется.
Я написал метод расширения IEnumerable , похожий на функцию Python zip (он объединяет два IEnumerables в набор пар), и попробовал это:
Это сработало! Так в чем же разница между этими двумя Assert.AreEqual s?
Рассматривали ли вы CollectionAssert вместо этого использование класса. учитывая, что он предназначен для проверки коллекций на равенство?
Приложение:
Если сравниваемые «коллекции» являются перечислениями, то просто обернуть их с помощью ‘ new List<T>(enumeration) ‘ — это самый простой способ выполнить сравнение. Создание нового списка, конечно, вызывает некоторые накладные расходы, но в контексте модульного теста это не должно иметь большого значения, я надеюсь?

Assert.AreEqual собирается сравнить два объекта под рукой. IEnumerable s сами по себе являются типами и предоставляют механизм для перебора некоторой коллекции. но на самом деле они не являются этой коллекцией. Ваше исходное сравнение сравнило два IEnumerable s, что является допустимым сравнением. но не то, что вам нужно. Вам нужно было сравнить, что эти два IEnumerable s должны были перечислить .
Вот как я сравниваю два перечисления:
Я не уверен, что в приведенном выше коде меньше кода, чем в вашем .Zip методе, но он настолько прост, насколько это возможно.
Я думаю, что самый простой и ясный способ подтвердить желаемое равенство — это комбинация ответа jerryjvl и комментария к его сообщению MEMark — в сочетании CollectionAssert.AreEqual с методами расширения:
Это дает более богатую информацию об ошибке, чем ответ SequenceEqual, предложенный OP (он сообщит вам, какой элемент был обнаружен, что было неожиданным). Например:
Вы будете очень довольны тем, что сделали это таким образом, если/когда ваш тест не пройден — иногда вы даже можете узнать, что не так, без необходимости запускать отладчик — и, эй, вы делаете TDD правильно, поэтому вы сначала пишете неудачный тест, правильно? 😉
Сообщения об ошибках становятся еще более полезными, если вы используете AreEquivalent для проверки эквивалентности (порядок не имеет значения):
MSTest v2: Exploring asserts
In the previous post, we created a simple test and run it. You write a test to assert your code behaves as expected. This means, assertions are central to unit testing in any framework, and MSTest is no exception. MSTest provides a rich set of assertions. So, today we’ll explore the Assert classes.
An assertion method is a method that takes parameters and ensures a condition is met. For instance, AreEqual takes 2 values and check they are equal. If an assertion fails, the method call does not return and an error is reported. The method throws an exception with a formatted message. If a test contains multiple assertions, any that follow the one that failed will not be executed.
Now, we can explore the different assert methods of the framework.
#Assertion on a single value
- Assert.AreEqual(object expected, object actual) : Tests whether the specified values are equal. Different numeric types are treated as unequal even if the logical values are equal. 42L is not equal to 42.
- Assert.AreNotEqual(object expected, object actual) : Tests whether the specified values are unequal. Same as AreEqual for numeric values.
- Assert.AreSame(object expected, object actual) : Tests whether the specified objects both refer to the same object
- Assert.AreNotSame(object expected, object actual) : Tests whether the specified objects refer to different objects
- Assert.IsTrue(bool condition) : Tests whether the specified condition is true
- Assert.IsFalse(bool condition) : Tests whether the specified condition is false
- Assert.IsNull(object value) : Tests whether the specified object is null
- Assert.IsNotNull(object value) : Tests whether the specified object is non-null
- Assert.IsInstanceOfType(object value, Type type) : Tests whether the specified object is an instance of the expected type
- Assert.IsNotInstanceOfType(object value, Type type) : Tests whether the specified object is not an instance of the wrong type
- StringAssert.Contains(string value, string substring) : Tests whether the specified string contains the specified substring
- StringAssert.StartsWith(string value, string substring) : Tests whether the specified string begins with the specified substring
- StringAssert.Matches(string value, Regex regex) : Tests whether the specified string matches a regular expression
- StringAssert.DoesNotMatch(string value, Regex regex) : Tests whether the specified string does not match a regular expression
I’ll only provide an example of AreEqual and AreSame because the difference is more subtle.
#Assertion on collections
- CollectionAssert.AreEqual(ICollection expected, ICollection actual) : Tests whether the specified collections have the same elements in the same order and quantity.
- CollectionAssert.AreNotEqual(ICollection expected, ICollection actual) : Tests whether the specified collections does not have the same elements or the elements are in a different order and quantity.
- CollectionAssert.AreEquivalent(ICollection expected, ICollection actual) : Tests whether two collections contain the same elements.
- CollectionAssert.AreNotEquivalent(ICollection expected, ICollection actual) : Tests whether two collections contain different elements.
- CollectionAssert.AllItemsAreInstancesOfType(ICollection collection, Type expectedType) : Tests whether all elements in the specified collection are instances of the expected type
- CollectionAssert.AllItemsAreNotNull(ICollection collection) : Tests whether all items in the specified collection are non-null
- CollectionAssert.AllItemsAreUnique(ICollection collection) : Tests whether all items in the specified collection are unique
- CollectionAssert.Contains(ICollection collection, object element) : Tests whether the specified collection contains the specified element
- CollectionAssert.DoesNotContain(ICollection collection, object element) : Tests whether the specified collection does not contain the specified element
- CollectionAssert.IsSubsetOf(ICollection subset, ICollection superset) : Tests whether one collection is a subset of another collection
- CollectionAssert.IsNotSubsetOf(ICollection subset, ICollection superset) : Tests whether one collection is not a subset of another collection
Here’s an example to show the difference between AreEqual and AreEquivalent :
#Test an exception is thrown
- Assert.ThrowsException<T>(Action action) : Tests whether the code specified by delegate throws an exception of type T (and not of derived type)
- Assert.ThrowsExceptionAsync<T>(Func<Task> action) : Same as ThrowsException with async code
#Other asserts
- Assert.Fail(string message)
- Assert.Inconclusive(string message)
Here’s an example of an inconclusive test
In the test explorer, inconclusive tests are grouped into «Skipped Tests»:

#Conclusion
MSTest v2 comes with more than 30 assert methods. This should help you writing your tests. In a future blog post, we’ll see how to extend the list of assert methods with your methods.
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Модульное тестирование в Visual Studio
Модульное тестирование (или Unit-тестирование) предназначено для проверки правильности выполнения небольшого блока кода, решающего свою конкретную задачу. В статье рассказывается, как проводить в модульное тестирование в Visual Studio. Разработка ведётся на языке C#.
Создание проекта программы, модули которой будут тестироваться
Разработаем проект содержащий класс, который вычисляет площадь прямоугольника по длине двух его сторон.
Создадим в Visual Studio новый проект Visual C# -> Библиотека классов. Назовём его MathTaskClassLibrary.
Class1 переименуем в Geometry.
В классе реализуем метод, вычисляющий площадь прямоугольника. Для демонстрации остановимся на работе с целыми числами. Код программы приведён ниже.
Площадь прямоугольника, как известно, это произведение двух его сторон.
Создание проекта для модульного тестирования в Visual Studio
Чтобы выполнить unit-тестирование, необходимо в рамках того же самого решения создать ещё один проект соответствующего типа.
Правой кнопкой щёлкните по решению, выберите «Добавить» и затем «Создать проект…».

В открывшемся окне в группе Visual C# щёлкните «Тест», а затем выберите «Проект модульного теста». Введите имя проекта MathTaskClassLibraryTests и нажмите «ОК». Таким образом проект будет создан.

Перед Вами появится следующий код:
Директива [TestMethod] обозначает, что далее идёт метод, содержащий модульный (unit) тест. А [TestClass] в свою очередь говорит о том, что далее идёт класс, содержащий методы, в которых присутствуют unit-тесты.
В соответствии с принятыми соглашениями переименуем класс UnitTest1 в GeometryTests.
Затем в References проекта необходимо добавить ссылку на проект, код которого будем тестировать. Правой кнопкой щёлкаем на References, а затем выбираем «Добавить ссылку…».
В появившемся окне раскрываем группу «Решение», выбираем «Проекты» и ставим галочку напротив проекта MathTaskClassLibrary. Затем жмём «ОК».

Также в коде необходимо подключить с помощью директивы using следующее пространство имён:
Займёмся написание теста. Проверим правильно ли вычисляет программа площадь прямоугольника со сторонами 3 и 5. Ожидаемый результат (правильное решение) в данном случае это число 15.
Переименуем метод TestMethod1() в RectangleArea_3and5_15returned(). Новое название метода поясняет, что будет проверяться (RectangleArea — площадь прямоугольника) для каких значений (3 и 5) и что ожидается в качестве правильного результата (15 returned).
Тестирующий метод обычно содержит три необходимых компонента:
- исходные данные: входные значения и ожидаемый результат;
- код, вычисляющий значение с помощью тестируемого метода;
- код, сравнивающий ожидаемый результат с полученным.
Соответственно тестирующий код будет таким:
Для сравнения ожидаемого результата с полученным используется метод AreEqual класса Assert. Данный класс всегда используется при написании unit тестов в Visual Studio.
Теперь, чтобы просмотреть все тесты, доступные для выполнения, необходимо открыть окно «Обозреватель тестов». Для этого в меню Visual Studio щёлкните на кнопку «ТЕСТ», выберите «Окна», а затем нажмите на пункт «Обозреватель тестов».

В студии появится следующее окно:

В данный момент список тестов пуст, поскольку решение ещё ни разу не было собрано. Выполним сборку нажатием клавиш Ctrl + Shift + B. После её завершения в «Обозревателе тестов» появится наш тест.

Синяя табличка с восклицательным знаком означает, что указанный тест никогда не выполнялся. Выполним его.
Для этого нажмём правой кнопкой мыши на его имени и выберем «Выполнить выбранные тесты».

Зелёный кружок с галочкой означает, что модульный тест успешно пройден: ожидаемый и полученный результаты равны.
Изменим код метода RectangleArea, вычисляющего площадь прямоугольника, чтобы сымитировать провал теста и посмотреть, как поведёт себя Visual Studio. Прибавим к возвращаемому значению 10.

Как Вы видите, красный круг с крестиком показывает провал модульного теста, а ниже указано, что при проверке ожидалось значение 15, а по факту оно равно 25.
Таким образом мы рассмотрели на практике модульное тестирование программы на языке C# в Visual Studio.
Вы можете скачать исходник решения по ссылке ниже или перейти в репозиторий данного проекта на GitHub:
Тестирование программного обеспечения — рекомендации
Приведём правило, которым следует руководствоваться при написании и проведении тестов для оценки правильного функционирования программ.
Удобнее всего будет рассмотреть пример основанный на математике.
Так или иначе тестируемый метод или функция (или вся программа в целом) имеет свою область допустимых входных значений. Для проверки правильности работы метода достаточно провести тестирование метода на входных значениях начала и конца области допустимых значений (ОДЗ), одного значения из внутренней части области, а также -1 от левой и +1 от правой границы области.
Например, если ОЗД функции F — это отрезок [0; 100], то для проверки корректности работы функции достаточно протестировать следующие варианты: F(0), F(50) [не обязательно 50, можно взять любое число из внутренней части ОДЗ], F(100), F(-1), F(101).