Определяет, как сообщения от производителей (producers) направляются в очереди через обменники (exchanges).
Отправляют сообщения в обменники.
Направляют сообщения в очереди на основе привязок (bindings) и типа обменника:
Direct Exchange: Сообщения направляются в очереди, соответствующие точному ключу маршрутизации.
Topic Exchange: Направляет сообщения в очереди по шаблону ключа маршрутизации.
Fanout Exchange: Широковещательно отправляет сообщения во все очереди, связанные с обменником.
Headers Exchange: Использует заголовки сообщений для маршрутизации.
Получают сообщения от обменников.
Связывают обменники с очередями и определяют правила маршрутизации.
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.iss.onethod.queue
channel.queue_bind(exchange='direct_logs', queue=queue_name, routing_key='info')
connection.close()
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
routing_key = 'info'
message = 'Hello, RabbitMQ!'
channel.basic_publish(exchange='direct_logs', routing_key=routing_key, body=message)
connection.close()
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='direct_logs', exchange_type='direct')
result = channel.queue_declare(queue='', exclusive=True)
queue_name = result.iss.onethod.queue
channel.queue_bind(exchange='direct_logs', queue=queue_name, routing_key='info')
def callback(ch, method, properties, body):
print(f"Received {body}")
channel.basic_consume(queue=queue_name, on_message_callback=callback, auto_ack=True)
print('Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥3
Сообщения направляются в очереди, которые связаны с обменником, если ключ маршрутизации сообщения точно совпадает с ключом маршрутизации, указанным в привязке. Логирование сообщений с разными уровнями важности, где каждая очередь получает сообщения с определенным уровнем (например, "info", "warning", "error").
channel.ExchangeDeclare(exchange: "direct_logs", type: "direct");
Сообщения направляются в очереди на основе шаблонов ключей маршрутизации. Поддерживаются подстановочные знаки:
* (заменяет одно слово) и # (заменяет ноль или более слов). Маршрутизация сообщений в зависимости от нескольких критериев, например, "logs.error", "logs.info.user".channel.ExchangeDeclare(exchange: "topic_logs", type: "topic");
Широковещательно отправляет сообщения во все очереди, связанные с этим обменником, игнорируя ключ маршрутизации. Широковещательная рассылка сообщений всем подписчикам, например, рассылка уведомлений.
channel.ExchangeDeclare(exchange: "logs", type: "fanout");
Направляет сообщения в очереди на основе заголовков сообщений, а не ключей маршрутизации. Можно задавать правила маршрутизации с использованием заголовков. Маршрутизация сообщений на основе различных свойств, таких как content-type или любые другие произвольные атрибуты.
channel.ExchangeDeclare(exchange: "headers_logs", type: "headers");
Direct
using RabbitMQ.Client;
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "direct_logs", type: "direct");
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: "direct_logs", routingKey: "info");
connection.Close();
Topic
using RabbitMQ.Client;
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "topic_logs", type: "topic");
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: "topic_logs", routingKey: "logs.*.user");
connection.Close();
Fanout
using RabbitMQ.Client;
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "logs", type: "fanout");
var queueName = channel.QueueDeclare().QueueName;
channel.QueueBind(queue: queueName, exchange: "logs", routingKey: "");
connection.Close();
Headers
using RabbitMQ.Client;
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.ExchangeDeclare(exchange: "headers_logs", type: "headers");
var queueName = channel.QueueDeclare().QueueName;
var headers = new Dictionary<string, object>
{
{ "x-match", "all" },
{ "key1", "value1" },
{ "key2", "value2" }
};
channel.QueueBind(queue: queueName, exchange: "headers_logs", routingKey: "", arguments: headers);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥6
Это система управления базами данных с открытым исходным кодом, работающая в памяти и поддерживающая множество типов данных, таких как строки, списки, множества, хеши и другие. Redis часто используется как кэш, брокер сообщений и база данных. Он известен своей высокой производительностью, низкой задержкой и простотой в использовании.
Redis хранит все данные в памяти, что обеспечивает очень быструю скорость чтения и записи. Данные также могут периодически сохраняться на диск для обеспечения долговечности.
Строки (Strings): Самый простой тип данных в Redis, который может содержать текст или двоичные данные.
Списки (Lists): Упорядоченные коллекции строк, которые можно использовать как очереди или стеки.
Множества (Sets): Неупорядоченные коллекции уникальных строк.
Упорядоченные множества (Sorted Sets): Коллекции уникальных строк, каждая из которых связана с числовым значением (score), определяющим порядок.
Хеши (Hashes): Коллекции пар "ключ-значение", где каждый хеш связан с ключом.
Bitmaps и HyperLogLogs: Для эффективного хранения и обработки больших объемов данных.
Благодаря хранению данных в памяти и простому протоколу клиент-сервер, Redis обеспечивает очень высокую скорость операций.
Redis поддерживает мастер-слейв репликацию, что позволяет создать резервные копии данных и обеспечить отказоустойчивость.
Redis Cluster позволяет распределить данные по нескольким узлам, обеспечивая горизонтальную масштабируемость.
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}");
}
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15
Это система кэширования, которая использует два различных уровня хранения данных для повышения производительности и обеспечения надежности. Такая система обычно включает более быстрый, но меньший по объему кеш первого уровня (L1) и более медленный, но более объемный кеш второго уровня (L2). Двухуровневое кэширование часто используется для улучшения времени доступа к данным и оптимизации использования ресурсов.
Характеристики: Высокая скорость доступа, меньший объем.
Типичные реализации: В памяти (например, локальный кеш на уровне приложения или узла).
Использование: Содержит наиболее часто используемые данные для быстрого доступа.
Характеристики: Медленнее, чем L1, но обладает большим объемом.
Типичные реализации: Внешние системы хранения данных (например, распределенные кеши или базы данных в памяти, такие как Redis).
Использование: Содержит данные, которые не поместились в L1 или которые используются реже.
var l1Cache = new L1Cache(100);
l1Cache.Set("myKey", "myValue");
var value = l1Cache.Get<string, string>("myKey");
var redisCache = new RedisCache();
redisCache.Set("myKey", "myValue");
var value = redisCache.Get("myKey");
using System;
using Microsoft.Extensions.Caching.Memory;
using StackExchange.Redis;
public class CacheService
{
private readonly MemoryCache _l1Cache;
private readonly IDatabase _l2Cache;
public CacheService(int l1CacheSize, string redisHost = "localhost", int redisPort = 6379, int redisDb = 0)
{
_l1Cache = new MemoryCache(new MemoryCacheOptions { SizeLimit = l1CacheSize });
var redis = ConnectionMultiplexer.Connect($"{redisHost}:{redisPort}");
_l2Cache = redis.GetDatabase(redisDb);
}
public string GetData(string key)
{
// Проверка в кеше L1
if (_l1Cache.TryGetValue(key, out string l1Value))
{
Console.WriteLine("L1 Cache Hit");
return l1Value;
}
// Проверка в кеше L2 (Redis)
var l2Value = _l2Cache.StringGet(key);
if (l2Value.HasValue)
{
Console.WriteLine("L2 Cache Hit");
_l1Cache.Set(key, l2Value, new MemoryCacheEntryOptions().SetSize(1));
return l2Value;
}
// Если данные не найдены, получение из исходного хранилища
Console.WriteLine("Cache Miss");
var dbValue = GetDataFromDatabase(key);
// Добавление данных в оба кеша
_l1Cache.Set(key, dbValue, new MemoryCacheEntryOptions().SetSize(1));
_l2Cache.StringSet(key, dbValue);
return dbValue;
}
private string GetDataFromDatabase(string key)
{
// Симуляция получения данных из базы данных
return $"Data for {key}";
}
}
Быстрый доступ к часто используемым данным через L1, при этом L2 обеспечивает хранение большого объема данных.
Сбалансированное использование памяти и внешних хранилищ для кэширования.
Разделение кеша на уровни позволяет сохранить доступность данных при отказе одного из уровней.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16🔥1
Это технология, обеспечивающая двустороннюю связь между клиентом и сервером через один TCP-соединение. В отличие от традиционного HTTP, который работает по принципу запрос-ответ, WebSockets позволяют передавать данные в обоих направлениях в режиме реального времени, что делает их идеальными для приложений, требующих мгновенного обмена данными.
Клиент и сервер могут отправлять данные друг другу независимо, без необходимости инициировать новый запрос.
После установления WebSocket-соединение остается открытым, что позволяет передавать данные с минимальной задержкой.
Меньшие накладные расходы по сравнению с HTTP, так как заголовки передаются только при установлении соединения, а не для каждого сообщения.
Поддержка большого количества одновременных соединений, что полезно для чатов, игр и других приложений с интенсивным обменом данными.
Клиент инициирует соединение с сервером через HTTP-запрос с заголовком
Upgrade, указывая, что он хочет перейти на WebSocket-протокол.Сервер отвечает согласием на переход на WebSocket-протокол, и соединение устанавливается.
После установления соединения данные могут передаваться в обоих направлениях до тех пор, пока одно из сторон не закроет соединение.
Сервер на Python с использованием библиотеки
websocketsimport asyncio
import websockets
async def handler(websocket, path):
async for message in websocket:
print(f"Received message: {message}")
await websocket.send(f"Echo: {message}")
start_server = websockets.serve(handler, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()
Клиент на JavaScript
const socket = new WebSocket('ws://localhost:8765');
socket.onopen = function(event) {
console.log('WebSocket is open now.');
socket.send('Hello, Server!');
};
socket.onmessage = function(event) {
console.log(`Message from server: ${event.data}`);
};
socket.onclose = function(event) {
console.log('WebSocket is closed now.');
};
socket.onerror = function(error) {
console.log(`WebSocket error: ${error}`);
};Подходит для приложений, где важна минимальная задержка, таких как чаты, игровые приложения и финансовые торговые платформы.
Меньшее количество данных передается по сети по сравнению с традиционными HTTP-запросами.
Простота в использовании и поддержка большинством современных браузеров.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🎉1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥2
В веб-разработке бекенд и фронтенд взаимодействуют друг с другом, чтобы создать полноценное веб-приложение. Бекенд — это серверная часть приложения, которая отвечает за обработку данных, выполнение бизнес-логики и взаимодействие с базой данных. Фронтенд — это клиентская часть, которая отвечает за отображение данных и взаимодействие с пользователем. Связь между ними осуществляется через API (Application Programming Interface).
Веб-приложения обычно строятся на основе архитектуры клиент-сервер:
Клиент (фронтенд): Браузер или мобильное приложение, которое пользователь видит и с которым взаимодействует.
Сервер (бекенд): Серверное приложение, которое обрабатывает запросы от клиента, выполняет бизнес-логику и возвращает ответы.
Фронтенд и бекенд взаимодействуют по протоколу HTTP (или HTTPS для защищенных соединений). Когда пользователь совершает действие на фронтенде (например, нажимает кнопку или заполняет форму), фронтенд отправляет HTTP-запрос на сервер.
Для взаимодействия между фронтендом и бекендом часто используют API:
REST (Representational State Transfer): Стандартный способ создания API, который использует HTTP-методы (GET, POST, PUT, DELETE) для взаимодействия с ресурсами на сервере.
GraphQL: Альтернатива REST, позволяющая клиенту запрашивать именно те данные, которые ему нужны.
Пример REST-запроса
// Пример контроллера на C# (ASP.NET Core)
[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
[HttpGet]
public IActionResult GetProducts()
{
var products = _productService.GetAllProducts();
return Ok(products);
}
[HttpPost]
public IActionResult CreateProduct(Product product)
{
_productService.AddProduct(product);
return CreatedAtAction(nameof(GetProduct), new { id = product.Id }, product);
}
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
var product = _productService.GetProductById(id);
if (product == null)
{
return NotFound();
}
return Ok(product);
}
}
Фронтенд и бекенд обмениваются данными в формате JSON или XML. JSON чаще используется из-за его простоты и легкости интеграции с JavaScript.
Пример JSON-ответа
[
{
"id": 1,
"name": "Product A",
"price": 100.0
},
{
"id": 2,
"name": "Product B",
"price": 150.0
}
]
Фронтенд отправляет запросы к бекенду с помощью библиотеки (например,
fetch или axios в JavaScript)// Пример использования fetch для отправки запроса
fetch('https://example.com/api/products')
.then(response => response.json())
.then(data => console.log(data));
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2
Это система, определяющая типы данных, которые могут использоваться в программе. Типы данных в .NET делятся на два больших класса: значимые типы (value types) и ссылочные типы (reference types). Каждый из них имеет свои особенности и используется в различных ситуациях.
Хранят свои значения непосредственно. Они создаются в стеке и имеют фиксированный размер.
Такие как
int, float, double, bool, char, и другие. Пример: int x = 10;Пользовательские типы данных, которые могут содержать примитивные типы и другие структуры.
struct Point
{
public int X;
public int Y;
}
Наборы именованных констант.
enum Day { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }Хранят ссылку на объект, который размещен в управляемой куче (heap). Они могут иметь переменный размер. Примеры ссылочных типов включают:
Могут содержать поля, свойства, методы и события.
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Описывают контракт, который должны реализовать классы.
interface IMovable
{
void Move();
}
Указатели на методы, которые могут быть вызваны позже.
delegate void Notify(string message);
Наборы элементов одного типа.
int[] numbers = { 1, 2, 3, 4, 5 };Последовательности символов. Пример:
string greeting = "Hello, world!";Создаются в стеке и передаются по значению. Это означает, что при передаче значимого типа создается его копия.
Создаются в куче, и переменные содержат ссылки на их адреса. При передаче ссылочного типа передается сама ссылка, а не копия объекта.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥3
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥1
Является статической, строгой и безопасной, что означает, что типы данных проверяются на этапе компиляции, типы данных должны строго соответствовать ожиданиям, и это предотвращает многие типичные ошибки во время выполнения.
Использует статическую типизацию, что означает, что типы переменных определяются и проверяются на этапе компиляции. Компилятор проверяет, чтобы все операции с этими переменными соответствовали их типам.
int number = 10; // Переменная number имеет тип int
string text = "Hello"; // Переменная text имеет тип string
Означает, что типы данных должны строго соответствовать ожиданиям.
int number = 10;
string text = "Hello";
// Это вызовет ошибку компиляции
// number = text;
// Необходимо явное преобразование
number = int.Parse("123");
Означает, что предпринимаются меры для предотвращения ошибок, связанных с неправильным использованием типов. Например, вы не можете выполнить операцию, не совместимую с типом данных:
int number = 10;
// Это вызовет ошибку компиляции
// number = number + "text";
Значимые типы хранят свои значения непосредственно и создаются в стеке. Они включают:
int, float, double, bool, charПользовательские типы, определяемые с помощью
structНаборы именованных констант, определяемые с помощью
enumПример класса
struct Point
{
public int X;
public int Y;
}
Ссылочные типы хранят ссылку на объект, который размещен в куче. Они включают:
Могут содержать поля, свойства, методы и события
Описывают контракт, который должны реализовать классы
Указатели на методы
Наборы элементов одного типа
Последовательности символов
Пример класса
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥10
Это характеристика языков программирования, при которой каждое выражение имеет строго определённый тип, и не допускаются неявные (автоматические) преобразования между типами, если они могут привести к ошибкам. В языках с строгой типизацией компилятор или интерпретатор проверяет типы данных на этапе компиляции или выполнения, чтобы предотвратить возможные ошибки.
Типы переменных и выражений известны и проверяются во время компиляции.
Автоматические преобразования между несовместимыми типами не допускаются. Например, строка не может быть неявно преобразована в целое число.
Если преобразование необходимо, программист должен явно указать это в коде, используя приведение типов.
Программа предотвращает операции, которые могут привести к ошибкам из-за несовместимости типов.
Примитивные типы
int number = 10;
string text = "Hello";
// Это вызовет ошибку компиляции, потому что `text` нельзя неявно преобразовать в `int`
// number = text;
// Необходимо явное преобразование
number = int.Parse("123"); // Явное преобразование строки в целое число
Классы и объекты
class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Person person = new Person();
person.Name = "John";
person.Age = 30;
// Это вызовет ошибку компиляции, так как типы не совместимы
// person.Age = "Thirty";
// Явное преобразование строки в целое число
person.Age = int.Parse("30");
Многие типичные ошибки могут быть обнаружены и исправлены еще до выполнения программы.
Явные типы и преобразования делают код более понятным.
Компилятор может более эффективно оптимизировать код, так как типы данных известны заранее.
Необходимость явных преобразований может увеличить объем кода.
Программисты могут столкнуться с ограничениями при работе с разнородными типами данных.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥3
Предназначены для проверки отдельных компонентов или модулей приложения в изоляции. Они помогают убедиться, что отдельные функции или методы работают правильно.
Цель: Проверка логики отдельных методов или классов.
Инструменты: 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.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4