Ответы пользователя по тегу Модульное тестирование
  • Норм ли использовать MSTest для создания юнит-тестов под .NET-проект (см. внутри)?

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


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

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


    AssemblyInitialize!

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

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

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Какой тип у 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 комментариев
  • Как составить план обучения после основ С#?

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Раз у тебя уже есть готовый список, то вот что можно ответить:

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

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

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

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

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

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

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

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

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

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

    vabka
    @vabka Куратор тега .NET
    Токсичный шарпист
    Сначала замечания по реализации:

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

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

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

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

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

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

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

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    Зависит от того, какую библиотеку для моков вы используете, но, скорее всего:
    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?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    vabka
    @vabka Куратор тега ASP.NET
    Токсичный шарпист
    С чего начать учить Unit тестирование?

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

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

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

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

    vabka
    @vabka
    Токсичный шарпист
    отлично обеспечивают регрессионное тестирование?

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

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

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

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

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

    vabka
    @vabka Куратор тега C#
    Токсичный шарпист
    > обход цикла в 2 000 000 итераций
    Лично я с необходимостью обходить цикл 2 000 000 раз в тестах не сталкивался, но если надо - значит есть зачем, значит никак не обойти.
    Но я бы посмотрел внимательней на код
    Ответ написан