TGViewer
Channel Public Channel
C# | Вопросы собесов

C# | Вопросы собесов

@easy_c_sharp

Сайт: https://easyoffer.ru/
Все каналы: t.me/+xGeAw6ckJ4liYzQy

Контакт для рекламы: @sendme_ads
Subscribers
5.01K
Photos
39
Videos
0
Links
1.6K

Showing posts older than #1873 · Back to latest

Older Posts 20 shown
Post #1872 1.05K
🤔 Возможно ли как-нибудь ограничить типы, которые пользователь будет передавать через шаблон?

Да, можно. В C# для ограничения (ограничений) обобщённых типов используется ключевое слово where.
Примеры ограничений:
- where T : class — только ссылочные типы.
- where T : struct — только значимые типы.
- where T : new() — должен иметь публичный конструктор без параметров.
- where T : BaseClass — должен быть наследником BaseClass.
- where T : interfaceName — должен реализовывать указанный интерфейс.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🔥 1
  • 🤔 1
Post #1870 1.02K
🤔 Пример выполнения кода, когда возвращается объект интерфейса Iqueryable?

IQueryable<T> — это интерфейс, который используется для отложенного выполнения запросов (deferred execution). Он позволяет строить SQL-запросы к базе данных или манипулировать данными в памяти, но сам запрос выполняется только в момент его итерации (ToList(), FirstOrDefault(), Count(), и т. д.).

🚩Пример работы с `IQueryable<T>` на Entity Framework Core

Предположим, у нас есть сущность Product и контекст базы данных AppDbContext
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}

public class AppDbContext : DbContext
{
public DbSet<Product> Products { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("YourConnectionString");
}
}


Теперь создадим репозиторий, который возвращает IQueryable<Product>
public class ProductRepository
{
private readonly AppDbContext _context;

public ProductRepository(AppDbContext context)
{
_context = context;
}

public IQueryable<Product> GetProducts()
{
return _context.Products.Where(p => p.Price > 100);
// Запрос не выполняется здесь! Только формируется
}
}


🚩Вызов метода и выполнение запроса

Запрос к базе данных выполнится только при материализации (ToList(), FirstOrDefault(), Count(), и т. д.).
var repository = new ProductRepository(new AppDbContext());

// Создаём IQueryable-запрос
IQueryable<Product> query = repository.GetProducts();

// Добавляем дополнительное условие (запрос еще НЕ выполнен)
query = query.OrderBy(p => p.Name);

// Теперь выполняем запрос к БД
List<Product> products = query.ToList(); // SQL-запрос отправляется в базу


Ставь 👍 и забирай 📚 Базу знаний
  • 🤔 1
Post #1869 1.03K
🤔 Когда инициируется сборка мусора?

Сборка мусора в C# инициируется автоматически, когда система обнаруживает, что недостаточно доступной памяти или при достижении порогов работы сборщика. Также она может быть запущена вручную с помощью метода `GC.Collect()`. Garbage collector удаляет объекты, которые больше не используются программой, освобождая память. Сборка мусора помогает предотвратить утечки памяти и поддерживает эффективность приложения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 2
Post #1868 1.1K
🤔 Какая есть классификация у кучи?

В информатике и программировании куча (heap) может классифицироваться по нескольким критериям. Рассмотрим основные виды:

🟠По назначению:
Куча памяти (Memory Heap)
Используется для динамического выделения памяти в приложениях.
В C# это управляется сборщиком мусора (GC - Garbage Collector).
Примеры: объекты, созданные с помощью new, выделяются в управляемой куче.

🟠Структура данных «Куча» (Heap Data Structure)
Это специальная бинарная структура данных, используемая в алгоритмах, например, в сортировке (Heap Sort) или в приоритетных очередях.
Бывает максимальная куча (max-heap) и минимальная куча (min-heap).

🚩По типу управления памятью (для кучи памяти в языках программирования):

🟠Управляемая куча (Managed Heap)
В C# и .NET память выделяется и освобождается автоматически с помощью GC. Разделяется на поколения (Generation 0, 1, 2), что оптимизирует работу сборщика мусора.

🟠Неуправляемая куча (Unmanaged Heap)
Применяется в C/C++ и низкоуровневом коде, где управление памятью выполняется вручную (malloc/free, new/delete). В C# тоже можно работать с ней через Marshal или Unsafe код.

🟠По структуре данных (Heap Data Structure):

🟠Максимальная куча (Max Heap)
Корневой узел содержит наибольшее значение, а дочерние узлы – меньшее. Используется в алгоритмах приоритетных очередей.

🟠Минимальная куча (Min Heap)
Корневой узел содержит наименьшее значение, а дочерние узлы – большее. Применяется в алгоритме Дейкстры и других задачах.

using System;
using System.Collections.Generic;

class Program
{
static void Main()
{
PriorityQueue<int, int> minHeap = new PriorityQueue<int, int>();

minHeap.Enqueue(5, 5);
minHeap.Enqueue(3, 3);
minHeap.Enqueue(8, 8);
minHeap.Enqueue(1, 1);

while (minHeap.Count > 0)
{
Console.WriteLine(minHeap.Dequeue()); // Выведет: 1, 3, 5, 8
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Post #1867 1.05K
🤔 Как работают дженерики под капотом?

Дженерики (Generics) — это шаблоны, которые компилируются один раз, но адаптируются под разные типы:
- Для значимых типов компилятор создаёт отдельные версии (специализации) — для повышения производительности и избежания boxing.
- Для ссылочных типов — используется единая реализация, потому что ссылки можно привести к общему типу.
Это делает дженерики мощными и безопасными, при этом эффективными.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 👍 1
  • 🔥 1
Post #1866 1.1K
🤔 Что такое сборщик мусора?

Сборщик мусора (Garbage Collector, GC) — это форма автоматического управления памятью. Он отслеживает каждый объект, выделенный в куче, и определяет, какие объекты более не доступны для приложения, а затем освобождает память, занимаемую этими объектами. Это ключевой компонент во многих современных языках программирования и средах выполнения, облегчая задачу управления памятью.

🚩Основные этапы работы

🟠Маркировка (Marking)
Сборщик мусора периодически проходит через все объекты в куче, начиная с "корней" (объектов, непосредственно доступных в программе, например, через переменные в стеке вызовов и глобальные переменные). Он отмечает все объекты, до которых можно добраться напрямую или косвенно.

🟠Очистка (Sweeping)
После маркировки доступных объектов, сборщик мусора удаляет все непомеченные объекты, освобождая ресурсы, которые они занимали.

🟠Компактификация (Compacting)
Некоторые сборщики мусора перемещают оставшиеся объекты, чтобы уменьшить фрагментацию памяти и улучшить производительность работы с памятью.

🚩Ограничения

🟠Производительность
Процесс сборки мусора может быть ресурсоёмким и может привести к заметным паузам в выполнении программы, особенно если куча большая.
🟠Непредсказуемость
Точное время сборки мусора может быть непредсказуемым, что может создавать проблемы в приложениях с реальным временем.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #1865 1K
🤔 Что такое value-type?

Это значимый тип. Хранится в стеке или встроен в объект. Содержит само значение, а не ссылку. Примеры:
- int, float, bool, struct.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🤔 2
Post #1864 1.22K
🤔 Что такое Rest?

REST (Representational State Transfer) — это архитектурный стиль разработки веб-сервисов, который стал основным методом создания веб-API. Этот стиль был введён Роем Филдингом в его докторской диссертации в 2000 году и основывается на принципах, используемых в протоколе HTTP.

🚩Основные принципы

🟠Client-Server
Архитектура строится на разделении клиента и сервера. Это разделение позволяет разрабатывать клиентскую и серверную части независимо друг от друга, что упрощает разработку и тестирование.

🟠Stateless
Каждый запрос от клиента к серверу должен содержать всю информацию, необходимую серверу для его понимания и выполнения. Сервер не должен хранить информацию о состоянии клиента между запросами. Если это необходимо, состояние следует хранить на клиенте.

🟠Cacheable
Ответы сервера должны быть явно помечены как кэшируемые или некэшируемые, чтобы клиенты могли кэшировать данные и повышать производительность, уменьшая количество запросов к серверу.

🟠Uniform Interface
Важнейший из принципов REST — единый интерфейс, который упрощает и обобщает взаимодействие между клиентом и сервером. Этот интерфейс определяет стандартные методы и форматы обмена информацией, которые должны быть одинаковыми для всех ресурсов. Типичными методами являются GET, POST, PUT, DELETE.

🟠Layered System
Клиент не должен предполагать, что он напрямую соединён с сервером. Между ними может находиться несколько слоёв, таких как балансировщики нагрузки или кэширующие прокси.

🟠Code on Demand (optional)
Серверы могут временно расширять или настраивать функционал на клиентах, передавая им исполняемый код (например, JavaScript).

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 2
Post #1863 1.02K
🤔 Что такое boxing и unboxing?

Boxing — это процесс преобразования значимого типа (например, int) в объект, чтобы хранить его в виде ссылочного типа. Unboxing— это обратный процесс преобразования объекта обратно в значимый тип. Эти операции создают накладные расходы на память и процессор, так как требуют размещения объектов в куче. Boxing и unboxing следует минимизировать для повышения производительности, особенно в критически важных местах программы.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Post #1862 1.05K
🤔 Что такое cancellation token в многопоточности?

CancellationToken в C# используется для координации отмены между потоками. Это механизм, позволяющий запрашивать отмену операции (например, задачи Task или асинхронного метода), не прерывая поток принудительно.

🚩Зачем нужен `CancellationToken`?

В многопоточных или асинхронных операциях бывает необходимо отменить выполнение кода, например:
Пользователь отменил загрузку файла.
Истек тайм-аут выполнения операции.
Нужно прервать выполнение нескольких связанных задач.

🚩Как работает `CancellationToken`?

🟠Создание `CancellationTokenSource`
Источник токена (CancellationTokenSource) управляет токеном (CancellationToken), который передаётся в задачи.

🟠Передача токена в выполняемую операцию
Код регулярно проверяет cancellationToken.IsCancellationRequested, чтобы определить, нужно ли остановиться.

🟠Запрос на отмену
Если вызывается cts.Cancel(), все методы, использующие этот токен, получают сигнал об отмене.

🚩Пример использования

using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
using var cts = new CancellationTokenSource();

// Отменяем операцию через 3 секунды
cts.CancelAfter(3000);

try
{
await DoWorkAsync(cts.Token);
}
catch (OperationCanceledException)
{
Console.WriteLine("Операция отменена!");
}
}

static async Task DoWorkAsync(CancellationToken cancellationToken)
{
for (int i = 0; i < 10; i++)
{
cancellationToken.ThrowIfCancellationRequested(); // Проверка отмены

Console.WriteLine($"Работаем... {i}");
await Task.Delay(1000, cancellationToken); // Ожидание с проверкой отмены
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
Post #1861 1K
🤔 Внешние ключи должны быть в базе данных?

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


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 💊 2
Post #1860 1.1K
🤔 Для чего нужны методы service configuration?

В ASP.NET Core методы Service Configuration используются для настройки и регистрации зависимостей в контейнере внедрения зависимостей (Dependency Injection, DI). Это позволяет управлять зависимостями в приложении, делая код более гибким, тестируемым и удобным для расширения.

🚩Где происходит настройка сервисов?

Настройка сервисов выполняется в методе ConfigureServices(IServiceCollection services), который находится в классе Program.cs или Startup.cs (в зависимости от версии .NET).
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(); // Добавление контроллеров для API
services.AddDbContext<ApplicationDbContext>(); // Регистрация контекста базы данных
services.AddScoped<IMyService, MyService>(); // Внедрение зависимости
}


🚩Основные виды регистрации сервисов

🟠`AddSingleton<T>`
создаёт единственный экземпляр объекта на всё время работы приложения.
services.AddSingleton<ILogger, ConsoleLogger>();


🟠`AddScoped<T>`
создаёт один экземпляр объекта на каждый HTTP-запрос.
services.AddScoped<IUserService, UserService>();


🟠`AddTransient<T>`
создаёт новый экземпляр объекта при каждом запросе.
services.AddTransient<IEmailSender, EmailSender>();


🚩Пример использования в контроллере

public class HomeController : Controller
{
private readonly IMyService _myService;

public HomeController(IMyService myService)
{
_myService = myService;
}

public IActionResult Index()
{
var data = _myService.GetData();
return View(data);
}
}


Ставь 👍 и забирай 📚 Базу знаний
Post #1859 1.01K
🤔 Что такое лямбда выражения в С#?

Лямбда-выражения — это анонимные функции, которые используются для создания кратких методов или делегатов в C#. Они упрощают работу с LINQ, коллекциями и обратными вызовами. Лямбда-выражения могут захватывать переменные из своей области видимости, делая их удобным способом для создания замыканий. Используются для упрощения и улучшения читаемости кода.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 💊 1
Post #1858 984
🤔 Что такое Redis?

Это система управления базами данных с открытым исходным кодом, работающая в памяти и поддерживающая множество типов данных, таких как строки, списки, множества, хеши и другие. Redis часто используется как кэш, брокер сообщений и база данных. Он известен своей высокой производительностью, низкой задержкой и простотой в использовании.

🚩Особенности

🟠Работа в памяти
Redis хранит все данные в памяти, что обеспечивает очень быструю скорость чтения и записи. Данные также могут периодически сохраняться на диск для обеспечения долговечности.

🟠Поддержка различных типов данных
Строки (Strings): Самый простой тип данных в Redis, который может содержать текст или двоичные данные.
Списки (Lists): Упорядоченные коллекции строк, которые можно использовать как очереди или стеки.
Множества (Sets): Неупорядоченные коллекции уникальных строк.
Упорядоченные множества (Sorted Sets): Коллекции уникальных строк, каждая из которых связана с числовым значением (score), определяющим порядок.
Хеши (Hashes): Коллекции пар "ключ-значение", где каждый хеш связан с ключом.
Bitmaps и HyperLogLogs: Для эффективного хранения и обработки больших объемов данных.

🟠Высокая производительность
Благодаря хранению данных в памяти и простому протоколу клиент-сервер, Redis обеспечивает очень высокую скорость операций.

🟠Поддержка репликации
Redis поддерживает мастер-слейв репликацию, что позволяет создать резервные копии данных и обеспечить отказоустойчивость.

🟠Кластеризация
Redis Cluster позволяет распределить данные по нескольким узлам, обеспечивая горизонтальную масштабируемость.

🟠Поддержка Lua-скриптов
Redis позволяет выполнять атомарные операции с помощью Lua-скриптов.

🟠Транзакции
Redis поддерживает транзакции, позволяя выполнить несколько команд атомарно.

🚩Примеры использования

🟠Кэширование
Redis часто используется для кэширования данных, что позволяет значительно уменьшить задержку доступа и снизить нагрузку на базу данных.
using StackExchange.Redis;
using System;

class Program
{
static void Main()
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();

db.StringSet("key", "value");
string value = db.StringGet("key");

Console.WriteLine(value);
}
}


🟠Сессии
Хранение сессий пользователя для веб-приложений, что обеспечивает быстрое и эффективное управление состоянием.

🟠Очереди сообщений
Использование списков или упорядоченных множеств для организации очередей сообщений.
using StackExchange.Redis;
using System;

class Program
{
static void Main()
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();

db.ListLeftPush("queue", "task1");
db.ListLeftPush("queue", "task2");

string task = db.ListRightPop("queue");
Console.WriteLine(task);
}
}


🟠Счетчики и рейтинги
Использование упорядоченных множеств для реализации счетчиков, рейтингов или систем рекомендаций.
using StackExchange.Redis;
using System;

class Program
{
static void Main()
{
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
IDatabase db = redis.GetDatabase();

// Add scores for users
db.SortedSetAdd("scores", "user1", 100);
db.SortedSetAdd("scores", "user2", 200);

// Retrieve scores with scores included
var scores = db.SortedSetRangeByRankWithScores("scores", 0, -1);

foreach (var score in scores)
{
Console.WriteLine($"{score.Element}: {score.Score}");
}
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 🔥 3
Post #1857 970
🤔 Как браузер отправляет запрос и получает ответ от API?

1. Браузер отправляет HTTP-запрос к серверу, указывая метод (например, GET или POST), заголовки и данные (если нужно).
2. Сервер обрабатывает запрос, взаимодействует с API и возвращает HTTP-ответ с данными или кодом состояния.
3. Ответ содержит тело, заголовки и статус выполнения запроса.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
  • 🤔 2
  • 💊 2
Post #1856 1.08K
🤔 Какие есть способы (протоколы) обмена данными между сервером и клиентом?

При взаимодействии клиента и сервера используются различные*протоколы обмена данными, в зависимости от задачи, скорости, надежности и реального времени.

🚩HTTP(S) – стандартный протокол веба

Клиент (браузер, мобильное приложение) делает запрос к серверу.
Сервер отправляет ответ с данными (HTML, JSON, XML).
Использует методы: GET, POST, PUT, DELETE и т. д.
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data));


🚩WebSocket – двусторонняя связь в реальном времени

Клиент устанавливает постоянное соединение с сервером.
Сервер и клиент могут отправлять друг другу данные в любое время.
Используется для чата, онлайн-игр, бирж, обновлений в реальном времени.
const socket = new WebSocket('wss://example.com/socket');

socket.onopen = () => socket.send('Привет, сервер!');
socket.onmessage = event => console.log('Сообщение от сервера:', event.data);


🚩SSE (Server-Sent Events) – поток данных от сервера

Клиент делает HTTP-запрос, но соединение не закрывается.
Сервер постепенно отправляет данные в виде событий (event-stream).
Используется для новостей, биржевых данных, уведомлений.
const eventSource = new EventSource('/events');

eventSource.onmessage = event => console.log('Новое сообщение:', event.data);


🚩gRPC – быстрый RPC поверх HTTP/2

Клиент вызывает удаленные методы напрямую как обычные функции.
Работает на HTTP/2, использует бинарный формат Protocol Buffers (быстрее, чем JSON).
Используется для высокопроизводительных API, микросервисов.
import grpc
import my_service_pb2
import my_service_pb2_grpc

channel = grpc.insecure_channel('localhost:50051')
stub = my_service_pb2_grpc.MyServiceStub(channel)
response = stub.MyMethod(my_service_pb2.MyRequest(name="Alice"))
print(response.message)


🚩MQTT – лёгкий протокол для IoT

Работает по модели издатель/подписчик.
Клиент подписывается на тему (topic) и получает сообщения, когда кто-то публикует данные.
Используется для умных устройств, датчиков, IoT.
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://broker.hivemq.com');

client.on('connect', () => {
client.subscribe('myTopic');
client.publish('myTopic', 'Привет, MQTT!');
});

client.on('message', (topic, message) => {
console.log(`Сообщение из ${topic}: ${message.toString()}`);
});


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 2
Post #1855 984
🤔 Какую проблему решает ThreadPool?

ThreadPool (пул потоков) решает проблему частого создания и уничтожения потоков, которое дорого по ресурсам.
Проблемы, которые он решает:
- Производительность (не тратится время на создание потока)
- Утилизация ресурсов
- Масштабируемость при высокой нагрузке


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Post #1854 992
🤔 Какие есть модификаторы доступа?

Есть модификаторы доступа, которые определяют, кто может использовать классы, методы и переменные. Они помогают скрыть внутренние детали кода и контролировать доступ к данным.

🚩Подробное объяснение с примерами

🟠`public` (Открытый доступ)
Открытый доступ означает, что элемент можно использовать везде.
public class Car
{
public string Model = "Tesla";
}

class Program
{
static void Main()
{
Car car = new Car();
Console.WriteLine(car.Model); // Доступ открыт
}
}


🟠`private` (Только внутри класса)
Самый закрытый модификатор. Поля и методы невидимы за пределами класса.
class Car
{
private string model = "Tesla";

private void PrintModel()
{
Console.WriteLine(model);
}
}

class Program
{
static void Main()
{
Car car = new Car();
// car.model = "BMW"; Ошибка! Поле `model` — private
// car.PrintModel(); Ошибка! Метод `PrintModel` — private
}
}


🟠`protected` (Доступен в наследниках)
Доступен только внутри класса и его наследников.
class Car
{
protected string Model = "Tesla";
}

class ElectricCar : Car
{
public void ShowModel()
{
Console.WriteLine(Model); // Можно, потому что наследуемый класс
}
}

class Program
{
static void Main()
{
ElectricCar eCar = new ElectricCar();
// eCar.Model Ошибка! Поле `Model` доступно только в наследниках
}
}


🟠`internal` (Только внутри проекта)
Элементы с internal можно использовать только внутри одной сборки (проекта).
internal class Engine
{
public void Start() => Console.WriteLine("Двигатель запущен");
}

class Program
{
static void Main()
{
Engine engine = new Engine();
engine.Start(); // Работает, потому что внутри того же проекта
}
}


🟠`protected internal` (В сборке и у наследников)
Этот модификатор разрешает доступ внутри сборки, а также в классах-наследниках за её пределами.
public class Car
{
protected internal string Model = "Tesla";
}

class ElectricCar : Car
{
public void ShowModel()
{
Console.WriteLine(Model); // Можно, потому что наследник
}
}


🟠`private protected` (Только в классе и наследниках из той же сборки)
Этот модификатор ещё жёстче, чем protected internal:
- Доступ внутри класса – да
- В наследниках – только внутри той же сборки
- В других проектах – нет доступа!
class Car
{
private protected string Model = "Tesla";
}

class ElectricCar : Car
{
public void ShowModel()
{
Console.WriteLine(Model); // Можно, потому что наследник в той же сборке
}
}

class Program
{
static void Main()
{
ElectricCar eCar = new ElectricCar();
// eCar.Model Ошибка! `Model` доступен только в наследниках из этой сборки
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
Post #1853 996
🤔 Что такое Transient?

Transient — это самый короткий жизненный цикл.
Новый объект создаётся каждый раз, когда он запрашивается.
Подходит для лёгких, статeless-компонентов, где не требуется запоминание состояния.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Post #1852 1.13K
🤔 Какие тесты бывают?

🚩Виды

🟠Юнит-тесты
Предназначены для проверки отдельных компонентов или модулей приложения в изоляции. Они помогают убедиться, что отдельные функции или методы работают правильно.
Цель: Проверка логики отдельных методов или классов.
Инструменты: xUnit, NUnit, MSTest.
using Xunit;

public class CalculatorTests
{
[Fact]
public void Add_SimpleValues_ReturnsSum()
{
var calculator = new Calculator();
var result = calculator.Add(2, 3);
Assert.Equal(5, result);
}
}

public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}


🟠Интеграционные тесты
Проверяют взаимодействие между различными компонентами системы, убеждаясь, что они корректно работают вместе.
Цель: Проверка взаимодействия между модулями.
Инструменты: xUnit, NUnit, MSTest, плюс дополнительные библиотеки для тестирования баз данных или HTTP-запросов.
using System.Net.Http;
using System.Threading.Tasks;
using Xunit;

public class IntegrationTests
{
private readonly HttpClient _client;

public IntegrationTests()
{
var appFactory = new CustomWebApplicationFactory<Startup>();
_client = appFactory.CreateClient();
}

[Fact]
public async Task Get_EndpointReturnsSuccessAndCorrectContentType()
{
var response = await _client.GetAsync("/api/values");
response.EnsureSuccessStatusCode();
Assert.Equal("application/json; charset=utf-8", response.Content.Headers.ContentType.ToString());
}
}


🟠Функциональные тесты
Проверяют, что приложение выполняет свои функции в соответствии с требованиями. Эти тесты проверяют конкретные сценарии использования.
Цель: Проверка функциональности приложения на уровне пользователя.
Инструменты: Selenium, Playwright, Cypress.
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Xunit;

public class UiTests
{
[Fact]
public void LoadPage_CheckTitle()
{
using (IWebDriver driver = new ChromeDriver())
{
driver.Navigate().GoToUrl("https://example.com");
Assert.Equal("Example Domain", driver.Title);
}
}
}


🟠Системные тесты
Проверяют приложение в целом, включая взаимодействие с внешними системами и проверку всех требований.
Цель: Проверка всей системы в интегрированном виде.
Инструменты: JUnit, TestNG для Java, или те же инструменты, что и для функциональных тестов.

🟠Приемочные тесты
Проводятся для проверки, что приложение соответствует требованиям и готово к использованию клиентом или конечным пользователем.
Цель: Подтверждение соответствия приложения требованиям.
Инструменты: Cucumber, SpecFlow (для BDD).

🟠Регрессионные тесты
Проверяют, что недавние изменения в коде не нарушили существующую функциональность.
Цель: Убедиться, что новые изменения не привели к новым багам.
Инструменты: Все инструменты для юнит-тестирования и функционального тестирования.

🟠Нагрузочные тесты
Проверяют, как приложение ведет себя под нагрузкой, например, при большом количестве одновременных пользователей или операций.
Цель: Оценка производительности и устойчивости приложения под нагрузкой.
Инструменты: JMeter, Gatling, Apache Bench.

Ставь 👍 и забирай 📚 Базу знаний
  • 👍 2
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →