Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810

Как пользоваться юнит-тестами?

19.08.2024, 14:20. Показов 2124. Ответов 28

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Мне кажется, что пресловутую систему тестирования писали какие-то однопроходные лоботомированные макаки, потому что по-нормальному там не получатся сделать ничего.

Итак, рассматриваю систему NUnit. Проект на Net. Framework 4.6.1. Особенность: у меня есть куча проектов-библиотек (Class Library), в каждой из которых я хочу создать папку Tests с тестами к этому проекту. Мне так удобнее.
В packages.config я пишу
XML
1
2
3
4
5
<packages>
  <package id="NUnit" version="3.14.0" targetFramework="net461" />
  <package id="NUnit.Analyzers" version="3.10.0" targetFramework="net461" developmentDependency="true" />
  <package id="NUnit3TestAdapter" version="3.17.0" targetFramework="net461" />
</packages>
Эмпирически установлено , что в 4.6.1 не работают пакеты серии 4. Я не знаю на фига для пары используемых мною атрибутов нужны пакеты NUnit3TestAdapter и NUnit.Analyzers, но гайды советуют их. Впрочем не работает и так, и так.
Класс самый элементарный:
C#
1
2
3
4
5
6
7
8
9
[TestFixture]
public class Sensor418
{
    [Test]
    public void Test()
    {
        Assert.Pass("11234");
    }
}
Стандартное окно (Test -> Run All Tests) вообще ничего не позволяет запустить. (Test1.png).
Через решарпер (Resharper -> Tests -> Run all unit tests) (Test2.png) тесты можно запустить. Но он ругается
на Inconclusive: Exit code is 14942211
Также Resharper пишет
WARN Process C:WARN Element <TE25KMx2.Tests.Sensor418.Test> was left Pending after its run completion.
Могут ли unit-тесты запустить хоть что-нибудь?
Миниатюры
Как пользоваться юнит-тестами?   Как пользоваться юнит-тестами?  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.08.2024, 14:20
Ответы с готовыми решениями:

Что такое юнит тестирование? Как им пользоваться?
Народ можете, кто-нибудь на просто примере показать, как тестировать какой-либо функционал в WinForms или WPF проекте? Чтобы было понятно в...

Нужно прислать обратно архив с уже сделанными юнит тестами
Доброго времени суток, господа! Помогите, пожалуйста, написать пару юнит тестов для моего проекта. Т к там тыркать много, было бы...

Как пользоваться тестами в Django Rest Framework
Я не знаю, что нужно сделать, чтобы заставить работать вшивые тесты, но с библиотекой requests - запуская с помощью неё запросы из консоли...

28
Эксперт .NET
 Аватар для Rius
13838 / 7880 / 1706
Регистрация: 25.05.2015
Сообщений: 23,923
Записей в блоге: 14
20.08.2024, 09:51
Студворк — интернет-сервис помощи студентам
Когда запуск через интерфейс visual studio не работает, когда открываешь старый проект год-два спустя, а он тебе "no tests discovered" и ни единой ошибки, то нафиг он нужен..
На mstest тоже проблем не стало.
0
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
20.08.2024, 09:55  [ТС]
Цитата Сообщение от HF Посмотреть сообщение
У вас явно что-то наворочено в коде
Скорее всего, я исходил и исхожу их принципа "тесты для проекта", а не "проект для тестов" и изначально строил проект без них (и уже не хочу засорять мои 70 библиотек таким говном)
В одиночном проекте "только для тестов" у меня тесты как-то проходят.

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

Есть общая библиотека TrainSimulatorLibrary.dll, в ней такой код
C#
1
2
3
4
5
6
7
8
9
    public interface IAsserter
    {
        void IsTrue(bool value, string message);
    }
    public abstract class BaseTest(IAsserter asserter)
    {
        protected readonly IAsserter asserter = asserter;
        public abstract void Test();
    }
Одна из моих библиотек TE25KMx2.dll ссылается на TrainSimulatorLibrary.dll, ничего не знает о NUnit, но содержит статический класс Tests умеющий возвращать список тестов в нем и вызывать их.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
    public static class Tests
    {
        public static List<string> GetTests() => new()
        {
            "Equals2Test,1",
            "Equals2Test,2",
            "Equals2Test,3"
        };
        public static BaseTest GetTest(IAsserter asserter, string name)
        {
            var str = name.Split(',');
            var number = int.Parse(str[1]);
            return new Equals2Test(asserter, number);
        }
    }
    public class Equals2Test(IAsserter asserter, int number) : BaseTest(asserter)
    {
        public readonly int number = number;
 
        public override void Test()
        {
            asserter.IsTrue(number == 2, $"Number = {number}");
        }
    }
Также у меня есть созданный с нуля проект с тестами TrainSimulatorTests, который ссылается на TrainSimulatorLibrary, ссылается на NUnit, но не ссылается на TE25KMx2.dll . К классу TE25KMx2.dll.Tests он попадает рефлекшном.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    public class Asserter : IAsserter
    {
        public void IsTrue(bool value, string message) =>
            Assert.IsTrue(value, message);
    }
    public class AssemblyTester
    {
        private static readonly Assembly assembly = 
            Assembly.LoadFile("D:\\PKBCT\\TrainSimulator2009\\TE25KMx2\\bin\\Debug\\TE25KMx2.dll");
        private static readonly Asserter asserter = new ();
 
        public static List<string> GetTestCases()
        {
            var type = assembly.GetType("TE25KMx2.Tests");
            var method = type.GetMethod("GetTests");
            var result = method?.Invoke(null, Array.Empty<object>());
            return result as List<string>;
        }
 
        [Test, TestCaseSource(nameof(GetTestCases))]
        public void TestFile(string filename)
        {
            var type = assembly.GetType("TE25KMx2.Tests");
            var method = type.GetMethod("GetTest");
            var test = method?.Invoke(null, new object[] { asserter, filename}) as BaseTest;
            Assert.IsNotNull(test);
            test.Test();
            //do test
        }
    }
И это извращение работает и дебажится!, лол
Конечно же это пока просто тест-набросок, многое надо дописать.
Я например пока не знаю как буду вызывать все 70 библиотек в нем: наверное просто создам 70 разных классов типа AssemlyTester (чтобы все иерархично отображалось в Unit Test Sessions).
И имена не очень хорошо отображаются: TestFile("Equals2Test,2") вместо желаемого Equals2Test,2
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
20.08.2024, 10:21
jetyb, Эммм.... Дак в решение просто добавляется проект с тестами, к нему подключаются нужные проекты из решения и всё. Проект с тестами это отдельная сборка и никак не влияет на код всего остального...
1
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
20.08.2024, 10:24
jetyb, Вот так это выглядит
0
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
20.08.2024, 11:45  [ТС]
Andrey-MSK, Ну, мне так наверное удобнее.
Удобнее держать код тестов библиотек в локальных библиотеках, чем создавать супер тест-проект знающий все о всех 70 библиотеках.
Напрямую подключать библиотеки не хочу, чтобы мудацкое IDE не перебилживало мне весь соллюшн при запуске тестов.
Один костыль с рефлекшном видится мне меньшим злом.
0
HF
 Аватар для HF
1340 / 924 / 202
Регистрация: 09.09.2011
Сообщений: 2,748
Записей в блоге: 2
20.08.2024, 12:01
Цитата Сообщение от jetyb Посмотреть сообщение
Удобнее держать код тестов библиотек в локальных библиотеках, чем создавать супер тест-проект знающий все о всех 70 библиотеках.
Создавайте тогда отдельный тест проект на каждый проект. Будет очёнь чёткая структура.

Цитата Сообщение от jetyb Посмотреть сообщение
Напрямую подключать библиотеки не хочу, чтобы мудацкое IDE не перебилживало мне весь соллюшн при запуске тестов.
Эмм... А когда тест внутри самого проекта и вы тест меняете, то оно не перебилживает солюшен?
Насчёт "му...го". IDE значит билдит да? А нужно чтобы он ничего не билдил и брал какие-то старые версии? Ему наверное виднее - нужно ему всё перебилживать или нет. Или вы лучше знаете? Ну это так.. намёк.
1
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,749
Записей в блоге: 4
20.08.2024, 12:10
jetyb,
Цитата Сообщение от HF Посмотреть сообщение
Создавайте тогда отдельный тест проект на каждый проект. Будет очёнь чёткая структура.
В этом случае тест будет перестраивать только тот проект, на который он настроен. Все остальные он не тронет.
0
298 / 260 / 108
Регистрация: 26.10.2012
Сообщений: 810
20.08.2024, 12:56  [ТС]
HF, Andrey-MSK, Спасибо подумаю. Я пока тесты только начал использовать.
0
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
20.08.2024, 18:53
Цитата Сообщение от jetyb Посмотреть сообщение
Напрямую подключать библиотеки не хочу, чтобы мудацкое IDE не перебилживало мне весь соллюшн при запуске тестов.
Выделите отдельный солюшен для тестов, который будет знать об dll только как о файлах. Можно просто натравить на output build, или же прям publisher сделать который будет закидывать файлы в нужную директорию. Причем можно заливать дебаг версию, и по необходимости подключать файлы для отладки.

Вообще юнит тесты это не только про "проверить код на ошибки", а ещё облегчение разработки проекта: когда нужно впаять новый модуль, а проверить нет возможности -- тесты позволяют нормально прогнать работу кода и глянуть что получиться.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2024, 18:53

Анализ покрытия кода юнит-тестами в CLion
Всем привет. Некоторое время назад познал радость и пользу от применения юнит-тостов и удивился узнав, что в CLion ещё нет встроенного...

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

Как прогнать по архиву с тестами
https://olimpiada.ru/activity/73/tasks На сайте можно скачать архив с тестами. Как прогнать решение по тестам?

Как сделать анализ покрытия тестами в c++ builder
В общем, партия поставила задачу: анализ покрытия кода тестами. Как это сделать - никто не знает, а сертификацию получить надо. Прога...

Как создать электронную книгу со встроенными тестами
Мне необходимо создать электронную книгу, со встроенными тестами. Разделить ее по главам например прочитал первую главу прошел тест, если...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru