Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,775

Тест простого метода

02.06.2025, 21:16. Показов 8208. Ответов 100
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил попробовать написть тест для одного из методов, где без тестов реально иногда баги вылезают при доработках.

Метод простой - получает на вход подключение к БД, возвращает в виде многоуровневой структуры объектов информацию обо всей структуре БД (таблицы, колонки, индексы, связи, триггеры и т.п.).

Общая структура теста в итоге получилась такая:
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
    [Fact]
    public void ParseDbSchemeTest()
    {
        //
        //Подготовка окружения.
 
        //Подключение к тестовому SQL-серверу.
        using var conn = CreateConnection();
 
        //Создание тестовой БД, создание структуры БД, покрывающей все сценарии.
        var dbName = "sample_db";
        PreapareTestDb(conn, dbName);
 
        //Структура БД для сравнения (загрузка из JSON, например).
        Database expectedDbStructure = PrepareExpected();
 
        //
        //Выполнение тестируемого метода.
        //* через information_schema считывает структуру БД (таблицы, колонки, индексы и т.п.)
        //* и раскладывает её в многоуровевую структуру объктов.
        Database actualDbStructure = new DatabaseParser().Parse(conn, dbName);
        DropTestDb(conn, dbName);
 
        //
        //Проверка результата.
        //* тут полное сравнение структур на всю глубину.
        Assert.True(expectedDbStructure.Equals(actualDbStructure));
    }
Технически, этот тест закрывает все сценарии, когда кто-то вносит некорректные изменения в:
1. SQL-скрипты, которые делают выборку из 'information_schema' в методе 'Parse'.
2. Логику раскладывания данных из 'information_schema' в экземпляр 'Database'.

Однако, если кто-то из разработчиков дополнит обозначенные два пункта новым функционалом, не затронув существующий, тест продолжит корректно продоходить, но при этом фактически не будет покрывать все возможные сценарии метода 'DatabaseParser.Parse'.

Получается, что нужен ещё один тест, который будет контролировать, что структура типа 'Database' (и всех используемых в нём типов, состав всех енумов) строго соответствуют ожидаемому состоянию.

Т.е. получается:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    [Fact]
    public void DbSchemeStructureTest()
    {
        //
        var type = typeof(Database);
 
        //Ожидаемая структура (из JSON, например).
        var expectedTypeInfo = LoadExcpectedTypeStructure(type);
 
        //Разбор (через reflection) структуры типа 'Database' на всю глубину.
        var actualTypeInfo = ParseByReflection(type);
 
        //
        Assert.True(expectedTypeInfo.Equals(actualTypeInfo));
    }
Теперь получается, что если кто-то внесёт изменения в тип 'Database' (или любой используемый в нём тип), то второй тест не пройдёт. Нужно будет внести изменения в метод 'LoadExcpectedTypeStructure'. И где-то там надо будет написать очень заметный комментарий, что в случае внесения изменений в 'LoadExcpectedTypeStructure' нужно согласнованно доработать первый тест, а именно:
1. Дополнить метод 'PreapareTestDb' новыми сценариями.
2. Дописать в 'expectedDbStructure.Equals' логику сравнения для новых свойств/типов.

P.S.: вопрос - как сделать это правильно ? Потому как сейчас это выглядит слишком громоздко (в плане написания всех вспомогательных методов и подготовки тестовых данных). И не слишком надёжно, т.к. по сути оставляет шанс, что первый тест попросту забудут доработать под новые сценарии, т.к. он просто пройдёт, и его просто не заметят.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.06.2025, 21:16
Ответы с готовыми решениями:

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

Юнит-тест для метода
Есть класс но сделать под него юнит тест не выходит если ты добрый человек помоги прошу ...

Unit-тест для void метода
Возник вопрос, как написать юнит тест для void метода, не принимающего ничего. using System;...

100
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
11.06.2025, 22:34
Студворк — интернет-сервис помощи студентам
с
Цитата Сообщение от kotelok Посмотреть сообщение
Не, тест на одном значении. Просто рандомном.
Вот не рекомендую пихать этот рандом. Он погоды не делает, а те самые ms добавит. 2-3 значения в листе за глаза.

Цитата Сообщение от kotelok Посмотреть сообщение
Вероятно, можно и то, и то оставить.
В идеале нужны оба. Но если расставлять приоритеты (скажем времени на тесты не много), то проверка вызовов -- вторична. Главное проверить что ожидаемый результат проходит, он косвенно проверяет и эти самые вызовы.

Цитата Сообщение от wizard41 Посмотреть сообщение
Но сойдет, просто нет желания расписывать подводные камни.
За тестирования многопоточности шибко не подскажу. Технически все эти async-await -- сахар над Task, и абсолютно спокойно можно крутить в одном потоке, если вся суть в том что "данные прилетают не сразу". А вот если код подразумевает конкуренцию за ресурсы... могу только пожелать удачи, вообще без понятия как это правильно тестировать.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.06.2025, 22:34

Unit тест для метода
имеется следующий метод public int Summ(string s) { return s.Split(new {','},...

Юнит-тест для асинхронного метода
Доброго всем времени суток! В теме "Логирование при использовании многопоточности" уважаемый...

Unit тест для метода
привет всем, есть следущий метод: private void CheckChanges() { if...

Вызов переменной метода A из метода В
Добрый день. Подскажите как происходит вызов Например даны два класс А и В, в каждом классе есть...

Вызов метода, ожидающего завершение другого метода
Имеется процедура Proc. Я её вызываю в Button. Только вот программа, не дожидаясь завершения...


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

Или воспользуйтесь поиском по форуму:
101
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты 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, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru