Задать вопрос
Ответы пользователя по тегу Модульное тестирование
  • Как тестировать оплату по QR-коду тестовой картой?

    Можно сгенерировать qr код для тестовой оплаты.
    Ответ написан
  • Как правильно тестировать базу данных в .NET?

    Вся логика выборок, фильтров и т.д. вынесена на уровень Storage Procedure, значит не получится создать тестовую БД с тестовыми данными.

    Это ещё почему? Во время прогона тестов поднимаете полноценную СУБД, которую заполняете всеми табличками и процедурами.
    Больше вариантов нет, если хочется этот слой протестировать.
    При наличии миграций - это не должно быть сильно сложно.

    В крайнем случае можно взять дамп продовой базы, вычистив все чувствительные данные.
    Ответ написан
    2 комментария
  • Норм ли использовать MSTest для создания юнит-тестов под .NET-проект (см. внутри)?

    1. Есть xunit
    2. Есть библиотеки с альтернативными ассертами. Например я везде fluentassertions использую
    3. Mstest на коре вроде тоже есть.
    4. Вместо атрибута ExpectedException лучше использовать аналогичный ассерт:
    https://docs.nunit.org/articles/nunit/writing-test...


    позволяет удобно работать с XML-файлами и не только

    Фу какая гадость. Зачем тебе это в тест-фреймворке???


    AssemblyInitialize!

    Зачем он тебе?
    Ответ написан
    Комментировать
  • Разница GET и DELETE запроса при проверке, что удалилась корзина?

    В случае delete, если корзина отсутствует - вполне может вернуться и 200 код и это будет вполне нормальным поведением, тк идемпотентность.
    Так что лучше проверить через get
    Ответ написан
    2 комментария
  • Как правильно записать Guid в юнит тесте?

    Какой тип у ProductId? Если это Guid, то смотри какие у него конструкторы есть.
    Проще всего через Guid.Parse.

    PS:
    А DbContext мокать не нужно. Используй вместо этого EF Core inmemory, либо Sqlite с размещением в оперативной памяти.

    Будет что-то типа:
    var conn = new SqliteConnection("DataSource=:memory:");
    var options = new DbContextOptionsBuilder<ApplicationContext>()
       .UseSqlite(conn)
       .Options;
    
    using var dbContext = new ApplicationContext(options);
    dbContext.Products.Add(new Product { /*...*/});
    dbContext.SaveChanges();
    
    var controller = new CartController(dbContext);
    // ...


    PPS:
    Если ты хочешь тестировать контроллеры - значит ты что-то делаешь не так. Возможны два варианта:

    1. Ты наговнокодил и затолкал бизнес-логику в контроллеры.
    Если так, то выноси логику в сервисы и делай так, чтобы контроллер зависел от сервисов.

    2. Тебе на самом деле нужны интеграционные / api-тесты / e2e-тесты. В таком случае тебе нужно не контроллер конструировать, а поднимать сервер и тестировать при помощи http-запросов. В таком случае следует ещё и по пути полноценную СУБД поднимать, а не мок.
    Ответ написан
    6 комментариев
  • Как составить план обучения после основ С#?

    Раз у тебя уже есть готовый список, то вот что можно ответить:

    Самое важное, без чего ты вообще никак не сможешь работать:
    ASP NET Core, Postgresql
    Им нужно уделить больше внимания.
    Курсы есть и по тому и по другому, есть и вполне хорошие бесплатные.
    Например у Postgrespro есть бесплатный курс (тебя должен интересовать PostgreSQL для разработчика) и книги.

    Затем то, что точно пригодится в работе, но что сравнительно быстро можно изучить:

    git - ты его не упомянул, но он очень важен. Есть бесплатная книга Pro Git где подробно описаны все его команды + есть немало видео на youtube где в действии показано, как им пользоваться.

    SOLID - можно почитать статьи и книгу "Чистая Архитектура". В любом случае от тебя не ждут знаний на уровне архитектора тут.

    Unit tests - просто попробуй сам писать тесты на каком-нибудь фреймворке. Например на xUnit.
    Ещё можешь почитать книжку Кента Бэка про разработку через тестирование.

    Code review - просто почитай пару статей о том, зачем это нужно, и как не быть мудаком-ревьюером, и как принимать обратную связь на ревью.

    Методологии разработки - просто ознакомься с теми, какие вообще есть.
    Большинство сейчас работают по Scrum или Kanban (либо на чём-то производном от них).
    Можешь ещё agile manifesto почитать
    Опять же - от тебя тут не ждут знаний уровня менеджера проектов, и тебе не придётся с нуля процесс разработки в команде выстраивать.
    Ответ написан
    1 комментарий
  • Нужно ли писать тест на код который использует статический метод?

    Это тебя нужно спросить, нужно ли писать.
    1. Как ты собрался писать тест на приватную функцию?
    2. Что ты получишь если напишешь всё-таки тест? Будет ли он полезен?
    Ответ написан
  • Как правильно называть тесты, есть ли общее правило для именования тестовых методов?

    Название теста должно отвечать на вопросы:
    1. Что тестируется?
    2. В какой ситуации?
    3. Что должно произойти?
    Например "Калькулятор при Умножении любого числа на ноль должен вернуть ноль"

    Ещё можно в BDD-стиле: Given-When-Then
    Ответ написан
    Комментировать
  • Можно код-ревью проекта на C# с юнит тестами?

    Сначала замечания по реализации:

    1. Раз уж мы делаем свой аналог List - тогда есть смысл вынести его в библиотеку, а не с Exe.
    TargetFramework стоит делать чуть более новым. Сейчас LTS - .NET 6 (но это не так уж и критично)

    2. Почему List Только для char реализован? Почему не сделать его обобщённым?

    3. Почему List не реализовывает стандартные интерфейсы? Тот же IEnumerable<T> хотябы.

    4. PrintForward - явно какой-то лишний метод. Список не должен отвечать за вывод в консоль.

    5. Публичный сеттер в Node выглядит как что-то опасное. Так можно изменить Next или Previous - лист изменится, вплоть до изменения количества элементов, но значение Count в самом листе не изменится, от чего всё поломается.

    А вот тесты наоборот выглядят вполне неплохо, но надо бы покрытие посмотреть.
    Ответ написан
    3 комментария
  • Как делать Unit тест юнита где идёт взаимодействие с внешним сервисом?

    Нужно отрефакторить этот модуль так, чтобы он не делал запрос во внешний сервис напрямую.
    Тогда можно будет ему, в рамках теста, подсунуть заглушку, вместо реального клиента.
    Ответ написан
    2 комментария
  • Как написать nUnit тест для ASP.NET контроллера, работающего с Task?

    Зависит от того, какую библиотеку для моков вы используете, но, скорее всего:
    1. в верхнем моке пишешь, с каким аргументом ожидается вызов метода этого сервиса
    2. затем вызываешь метод контроллера с каким-то параметром (какой хочешь протестировать)
    3. В конце делаешь ассерты, с помощью которых ты можешь убедиться, что у тебя всё сработало как надо.

    В этом случае так:
    var user = new User();
    
    var mock = new Mock<IUserService>();
    mock.Setup(service=>service.Add(user)); 
    var controller = new UsersController(mock.Object);
    
    var result = (OkObjectResult) await controller.Add(user); // await не забываем
    
    Assert.Equals(user, result.Value); // Ассерт, что контроллер вернул что ожидали
    mock.Verify(x=>x.Add(user)); //Ассерт, что был вызван метод мока
    Ответ написан
  • Как тестировать класс, который зависит от ILogger и IHttpClientFactory?

    В качестве ILogger можно передать NullLogger
    А в качестве IHttpClientFactory можно передать настояющую фабрику, либо замокать, чтобы она возвращала создавала HttpClient с кастомным HttpRequestHandler, который не отправляет настоящие запросы.

    https://anthonygiretti.com/2018/09/06/how-to-unit-...
    Ответ написан
    Комментировать
  • Как написать правильные Unit/Integration тесты?

    > как правильнее
    Выбирай оптимальное соотношение, между простотой написания, скоростью выполнения, и покрытием.

    Самые крутые по покрытию - end to end тесты, в рамках которых вы поднимаете всю инфраструктуру и делаете http запросы к тестируемому сервису.
    Но они достаточно медленные, тиебуют сложеой инфраструктуры, да и при написании нужно думать, как сделать так, чтобы тесты друг на друга не влияли.

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

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

    А теперь про остальное:
    Все пишем по TDD, все тесты зеленые, а баги все равно появляются.

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

    один из наших сервисов, который использует базу данных, отпарвляет SQL запрос с синкаксической ошибкой

    Выносишь кусок кода, который генерирует этот SQL-запрос в новый сервис, и тестируешь, что он всегда даёт корректный синтаксис.

    Советую почитать про чистую архитектуру
    Ответ написан
    Комментировать
  • Может ли модульное тестирование быть не автоматическим?

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

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

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

    Конечно, отдельно ещё в юнитах проверялась конвертация на небольших кусках, но надо было ещё в комплексе всё проверять.

    2. Тоже самое только с интеграционным тестированием, может ли оно быть не автоматическим ?

    Неавтоматическое интеграционное тестирование - это тоже ручное тестирование :)
    Ответ написан
    Комментировать
  • С чего начать учить Unit тестирование?

    С чего начать учить Unit тестирование?

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

    Можно ещё почитать книжку

    Видел что существует много их, типу Moq, XUnit и тд.

    Это инструменты для решения разных задач.
    Moq - для создания моковых объектов
    XUnit - непосредственно фреймворк для описания и запуска тестов.
    Ответ написан
    2 комментария
  • Какие еще преимущества у юнит-тестов, кроме того, что они отлично обеспечивают регрессионное тестирование?

    отлично обеспечивают регрессионное тестирование?

    Юниты кстати не всегда могут это обеспечить.
    Вполне обычная ситуация - все функции и классы работают идеально, но в приложении всё ломается, тк кто-то криво зарегал их в ioc, или опечатался в имени

    - писать юнит-тесты более трудоемко и долго, чем тестировать вручную.

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

    ИМХО, юнит-тестами, да и UI-тестами, надо покрывать далеко не всё.

    Да
    Ответ написан
    3 комментария
  • Какова приемлемая скорость модульного теста?

    > обход цикла в 2 000 000 итераций
    Лично я с необходимостью обходить цикл 2 000 000 раз в тестах не сталкивался, но если надо - значит есть зачем, значит никак не обойти.
    Но я бы посмотрел внимательней на код
    Ответ написан