HTTP-код 200 означает успешное выполнение запроса. Он указывает, что сервер обработал запрос и вернул корректный результат.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Вы мечтаете о карьере в области QA Тестирования, но не знаете, с чего начать подготовку к собеседованию? Тогда канал "Тестировщик | Вопросы собесов" (@easy_qa_ru) - именно то, что вам нужно! Здесь вы найдете разборы типичных вопросов, задаваемых на собеседованиях на позицию QA Тестировщика.
Подготовьтесь к интервью, изучите наиболее актуальные темы и узнайте, как правильно отвечать на вопросы работодателей. Для вашего удобства также доступен веб-сайт easyoffer.ru, где вы сможете найти еще больше полезного контента.
Не упустите возможность прокачать свои знания и стать востребованным специалистом в сфере тестирования! Присоединяйтесь к каналу (@easy_qa_ru) прямо сейчас и начните успешно проходить собеседования на позицию QA Тестировщика.
Решайте тесты и ищите работу в соответствующих разделах канала, чтобы быть максимально подготовленным к новым вызовам и перспективам. Уверенность в знаниях и умении правильно отвечать на вопросы сделает вас востребованным специалистом на рынке труда. Присоединяйтесь к сообществу успешных QA Тестировщиков и достигайте новых высот в своей карьере!
21 Feb, 16:10
21 Feb, 09:10
20 Feb, 16:10
20 Feb, 09:10
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>404 Not Found</h1>
<p>The requested URL /path/to/resource was not found on this server.</p>
</body>
</html>
HTTP/1.1 404 Not Found
Content-Type: application/json
{
"error": {
"code": 404,
"message": "Resource not found",
"details": "The requested resource /api/v1/resource was not found on this server."
}
}
const express = require('express');
const app = express();
app.use((req, res, next) => {
res.status(404).json({
error: {
code: 404,
message: "Resource not found",
details: `The requested resource ${req.originalUrl} was not found on this server.`
}
});
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
from flask import Flask, jsonify
app = Flask(__name__)
@app.errorhandler(404)
def not_found(error):
response = jsonify({
"error": {
"code": 404,
"message": "Resource not found",
"details": "The requested resource was not found on this server."
}
})
response.status_code = 404
return response
ifead>
<== "__main__":
app.run(debug=True)
19 Feb, 16:10
19 Feb, 09:10
18 Feb, 16:10
18 Feb, 09:10
[email protected]
) [email protected]
— невалидно) ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
@pytest.fixture
def driver():
driver = webdriver.Chrome()
driver.get("https://example.com/signup") # Открываем страницу регистрации
yield driver
driver.quit()
@pytest.mark.parametrize("email, expected", [
("[email protected]", True), # Валидный email
("invalid-email.com", False), # Нет "@"
("@nodomain.com", False), # Нет имени
("[email protected]", False), # Нет домена
("[email protected]", False), # Двойная точка
("[email protected]", False), # Слишком короткое доменное расширение
])
def test_email_validation(driver, email, expected):
email_input = driver.find_element(By.NAME, "email")
submit_button = driver.find_element(By.NAME, "submit")
email_input.clear()
email_input.send_keys(email)
submit_button.click()
error_message = driver.find_element(By.ID, "email-error")
if expected:
assert error_message.is_displayed() is False, f"Ошибка для валидного email: {email}"
else:
assert error_message.is_displayed() is True, f"Нет ошибки для невалидного email: {email}"
import pytest
import requests
BASE_URL = "https://example.com/api/register"
@pytest.mark.parametrize("email, expected_status", [
("[email protected]", 200),
("invalid-email.com", 400),
("[email protected]", 400),
])
def test_email_validation_api(email, expected_status):
response = requests.post(BASE_URL, json={"email": email})
assert response.status_code == expected_status
name: Run Email Validation Tests
on:
push:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v3
with:
python-version: '3.9'
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run tests
run: pytest tests/
17 Feb, 16:11
17 Feb, 09:10
16 Feb, 16:10
15 Feb, 16:10
14 Feb, 16:10
14 Feb, 09:10
13 Feb, 16:10
13 Feb, 09:10
12 Feb, 16:10
12 Feb, 09:10
11 Feb, 16:10
10 Feb, 20:14
10 Feb, 16:10
10 Feb, 09:10
123456
, логин пройдет? @Test
public void testLogin() {
driver.get("https://example.com");
driver.findElement(By.id("username")).sendKeys("user");
driver.findElement(By.id("password")).sendKeys("pass");
driver.findElement(By.id("login")).click();
Assert.assertTrue(driver.getTitle().contains("Dashboard"));
}
10 Feb, 07:00
09 Feb, 16:10
09 Feb, 09:10
java -XX:+PrintCommandLineFlags -version
# G1 GC (по умолчанию в Java 9+)
java -XX:+UseG1GC -jar app.jar
# ZGC (низкие паузы, для больших heap)
java -XX:+UseZGC -jar app.jar
# Shenandoah GC (минимальные задержки, Java 12+)
java -XX:+UseShenandoahGC -jar app.jar
# Serial GC (для маленьких приложений)
java -XX:+UseSerialGC -jar app.jar
java -Xms512m -Xmx4g -jar app.jar
java -Xlog:gc* -jar app.jar # Логи GC для Java 9+
java -XX:+PrintGCDetails -XX:+PrintGCDateStamps -jar app.jar # Для Java 8
08 Feb, 23:42
08 Feb, 16:10
08 Feb, 09:10
int divide(int a, int b) {
return a / b; // Ошибка: нет проверки на деление на 0
}
0
приложение вылетает с ошибкой. 07 Feb, 16:10
07 Feb, 09:10
06 Feb, 16:10
06 Feb, 09:10
pm.test
). 05 Feb, 17:10
05 Feb, 16:10
05 Feb, 09:10
clone()
, класс должен реализовать интерфейс Cloneable
, а метод clone()
нужно переопределить. class Person implements Cloneable {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone(); // Поверхностное копирование
}
}
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
Person p1 = new Person("Alice", 30);
Person p2 = (Person) p1.clone(); // Копируем объект
System.out.println(p1.name.equals(p2.name)); // true (строка хранится в пуле)
System.out.println(p1 == p2); // false (это разные объекты)
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
// Конструктор копирования
Person(Person other) {
this.name = other.name;
this.age = other.age;
}
}
class Address implements Cloneable {
String city;
Address(String city) {
this.city = city;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return new Address(this.city); // Создаем новый объект!
}
}
class Person implements Cloneable {
String name;
int age;
Address address;
Person(String name, int age, Address address) {
this.name = name;
this.age = age;
this.address = address;
}
@Override
protected Object clone() throws CloneNotSupportedException {
Person cloned = (Person) super.clone();
cloned.address = (Address) address.clone(); // Глубокое копирование
return cloned;
}
}
04 Feb, 16:10
04 Feb, 09:10
Тест-кейс: Вход в систему с корректными данными
Шаги:
1. Открыть страницу входа.
2. Ввести корректный логин пользователя.
3. Ввести корректный пароль пользователя.
4. Нажать кнопку "Войти".
Ожидаемый результат: Пользователь успешно входит в систему.
Тест-кейс: Вход в систему с некорректным паролем
Шаги:
1. Открыть страницу входа.
2. Ввести корректный логин пользователя.
3. Ввести некорректный пароль.
4. Нажать кнопку "Войти".
Ожидаемый результат: Система отображает сообщение об ошибке "Неправильный пароль".
03 Feb, 16:10
03 Feb, 09:10
StringBuilder
есть понятие вместимости (capacity
) — это количество символов, которые объект StringBuilder
может вместить без необходимости выделения новой памяти. StringBuilder
, у него есть внутренняя буферная строка, которая может расти по мере добавления новых символов. Однако, чтобы не выделять память слишком часто, StringBuilder
создает буфер с запасом.StringBuilder sb = new StringBuilder("Hello");
System.out.println(sb.capacity()); // 21 (16 + 5)
StringBuilder sb = new StringBuilder(50);
System.out.println(sb.capacity()); // 50
StringBuilder
, можно использовать: sb.ensureCapacity(100); // Гарантирует вместимость 100
StringBuilder
автоматически увеличивает размер буфера. новая_вместимость = (текущая_вместимость * 2) + 2
StringBuilder sb = new StringBuilder(10);
sb.append("12345678901"); // 11 символов → превышает 10
System.out.println(sb.capacity()); // (10 * 2) + 2 = 22
02 Feb, 16:10
02 Feb, 09:10
if
, else
, switch
). def check_number(x):
if x > 0:
return "Positive"
elif x < 0:
return "Negative"
else:
return "Zero"
01 Feb, 16:10
01 Feb, 09:10
31 Jan, 16:10
31 Jan, 09:10
30 Jan, 16:10
30 Jan, 09:10
git stage
как таковой нет, но существует команда, которая делает аналогичное действие — это git add
. Чтобы понять, что значит "stage", важно разобраться, как работает система Git.git add
— команда, которая добавляет изменения (новые, удалённые или изменённые файлы) в staging area. После выполнения этой команды Git начинает "отслеживать" изменения в указанных файлах и подготавливает их для следующего коммита.example.txt
. Вы вносите в него изменения.git add example.txt
git status
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: example.txt
🟠Фиксация изменений
После добавления в staging вы можете зафиксировать изменения:
git commit -m "Обновлён example.txt"
stage
вместо git add
. Также в Git есть alias:git stage <file> = git add <file>
29 Jan, 16:10
29 Jan, 09:10
def calculate_area(width, height):
return width * height
28 Jan, 16:10
28 Jan, 09:10
git cherry-pick
используется для выбора конкретных коммитов из одной ветки и их переноса в другую. Это позволяет взять отдельные изменения, внесённые в одном месте, и применить их в другом, без необходимости переносить всю историю изменений.git cherry-pick <commit-hash>
main
и вам нужно перенести коммит из ветки feature-branch
.# Сначала переключаемся в нужную ветку
git checkout main
# Берем конкретный коммит из другой ветки
git cherry-pick a1b2c3d
git cherry-pick a1b2c3d e4f5g6h
git cherry-pick a1b2c3d..e4f5g6h
feature-branch
есть два коммита:main
. # Находитесь в ветке main
git checkout main
# Переносите исправление
git cherry-pick a1b2c3d
27 Jan, 16:10
27 Jan, 09:10
{
"имя": "Иван",
"возраст": 30,
"isDeveloper": true,
"навыки": ["JavaScript", "React", "Node.js"],
"контакты": {
"email": "[email protected]",
"сайт": "https://ivan.dev"
}
}
26 Jan, 16:10
26 Jan, 09:10
GET /api/resource HTTP/1.1
Authorization: Bearer your_access_token
exp
.PyJWT
import jwt
SECRET_KEY = "your_secret_key"
def validate_jwt(token):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
return payload # Возвращает данные токена, если он валиден
except jwt.ExpiredSignatureError:
return "Token expired"
except jwt.InvalidTokenError:
return "Invalid token"
KEY123
имеет доступ только к определенным данным или функциям.payload
).401 Unauthorized
(для отсутствия или невалидного ключа).403 Forbidden
(если прав недостаточно).25 Jan, 16:10
25 Jan, 09:10
TC001
). 24 Jan, 16:10
23 Jan, 16:10
23 Jan, 09:10
22 Jan, 16:10
22 Jan, 11:29
22 Jan, 09:10
SELECT Name, Age FROM Users WHERE Age > 25;
21 Jan, 16:10
21 Jan, 09:10
21 Jan, 07:00
20 Jan, 16:10
20 Jan, 09:10
GET /products?category=electronics&sort=price_asc
GET /products/123
POST /users
{
"name": "John Doe",
"email": "[email protected]"
}
{
"id": 123,
"name": "Smartphone",
"price": 499.99
}
Content-Type
, Authorization
, Cache-Control
.
Content-Type: application/json
200 OK
— успешный запрос.201 Created
— ресурс успешно создан.404 Not Found
— ресурс не найден.500 Internal Server Error
— внутренняя ошибка сервера.19 Jan, 16:10
19 Jan, 09:10
18 Jan, 16:10
18 Jan, 09:10
17 Jan, 16:10
17 Jan, 09:10
16 Jan, 16:10
16 Jan, 09:10
# Selenium пример на Python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# Авторизация
driver.find_element("id", "email").send_keys("[email protected]")
driver.find_element("id", "password").send_keys("password123")
driver.find_element("id", "login-button").click()
# Навигация к сохраненным картам
driver.get("https://example.com/profile/cards")
# Проверка наличия карты
saved_card = driver.find_element("css selector", ".card-info")
assert "****1234" in saved_card.text
GET /api/users/{id}/cards
).import requests
url = "https://example.com/api/users/123/cards"
headers = {
"Authorization": "Bearer your_token"
}
response = requests.get(url, headers=headers)
assert response.status_code == 200
data = response.json()
assert data[0]["last4"] == "1234"
assert data[0]["brand"] == "Visa"
SELECT * FROM user_cards WHERE user_id = 123;
import stripe
stripe.api_key = "your_stripe_secret_key"
customer = stripe.Customer.retrieve("cus_12345")
saved_card = customer["sources"]["data"][0]
assert saved_card["last4"] == "1234"
assert saved_card["brand"] == "Visa"
15 Jan, 16:10
15 Jan, 09:10
GET /api/products?category=books&page=2 HTTP/1.1
Host: example.com
POST /api/users HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "John Doe",
"email": "[email protected]"
}
PUT /api/users/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"name": "Jane Doe",
"email": "[email protected]"
}
PATCH /api/users/1 HTTP/1.1
Host: example.com
Content-Type: application/json
{
"email": "[email protected]"
}
DELETE /api/users/1 HTTP/1.1
Host: example.com
GET
, но без возврата данных ресурса.14 Jan, 16:10
14 Jan, 09:10
13 Jan, 16:10
13 Jan, 09:10
div#header .menu-item
находит элемент с классом menu-item
, который находится внутри элемента с id header
. XPath (XML Path Language) XPath – это язык для навигации по XML и HTML-документам. Он позволяет находить элементы на основе их местоположения в иерархии. Пример: //div[@id='header']//a[text()='Home']
находит ссылку с текстом "Home", которая находится внутри элемента с id header
.#id
– элемент с определенным id..class
– элемент с определенным классом.div > p
– параграфы, находящиеся непосредственно внутри div.//input[@type='text']
– находит все текстовые поля.//div[2]
– второй div на странице.//a[contains(@href, 'login')]
– ссылки, содержащие "login" в атрибуте href...
) или выбор по тексту. Может перемещаться как вниз, так и вверх по дереву DOM. Не всегда стабилен в браузерах (особенно в старых версиях IE).button.login
– кнопка с классом login
. //button[text()='Login']
– кнопка с текстом "Login". input[type='email']
– поле ввода с атрибутом type="email"
. //input[@type='email']
– то же самое, но в XPath. div#menu a
– все ссылки внутри div с id menu
. //div[@id='menu']//a
– то же самое в XPath. 12 Jan, 16:10
12 Jan, 09:10
11 Jan, 16:10
11 Jan, 09:10
10 Jan, 16:10
10 Jan, 09:10
09 Jan, 16:10
09 Jan, 12:55
09 Jan, 09:10
SELECT name, age FROM users WHERE age > 18 ORDER BY name;
INSERT INTO users (name, age) VALUES ('John Doe', 30);
UPDATE users SET age = 31 WHERE name = 'John Doe';
DELETE FROM users WHERE age < 18;
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT
);
ALTER TABLE users ADD email VARCHAR(100);
DROP TABLE users;
ALTER TABLE orders ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id);
CREATE INDEX idx_name ON users (name);
08 Jan, 16:10
08 Jan, 09:10
07 Jan, 16:10
07 Jan, 09:10
Summary: Ошибка отображения кнопки "Отправить" в браузере Firefox на странице регистрации.
Summary: Проверка функции входа в систему с корректными учетными данными.
Summary: Тестирование завершено на 80%. Обнаружено 10 критических багов, 5 из которых исправлены. 90% функциональных тестов прошли успешно.
Summary: Релиз версии 2.1 включает в себя новые функции управления профилем, улучшения производительности и исправления 15 багов.
06 Jan, 16:10
06 Jan, 09:10
def add(a, b):
return a + b
import pytest
def test_add():
assert add(1, 2) == 3
assert add(-1, 1) == 0
assert add(0, 0) == 0
pytest
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
05 Jan, 16:10
05 Jan, 09:10
HTTP/1.1 505 HTTP Version Not Supported
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
<html>
<head>
<title>505 HTTP Version Not Supported</title>
</head>
<body>
<h1>HTTP Version Not Supported</h1>
<p>The server does not support the HTTP protocol version that was used in the request.</p>
</body>
</html>
04 Jan, 16:10
04 Jan, 09:10
04 Jan, 07:00
03 Jan, 16:10
03 Jan, 09:10
02 Jan, 16:10
02 Jan, 09:10
Тест-кейс: Вход в систему с корректными данными
Шаги:
1. Открыть страницу входа.
2. Ввести корректный логин пользователя.
3. Ввести корректный пароль пользователя.
4. Нажать кнопку "Войти".
Ожидаемый результат: Пользователь успешно входит в систему.
Тест-кейс: Вход в систему с некорректным паролем
Шаги:
1. Открыть страницу входа.
2. Ввести корректный логин пользователя.
3. Ввести некорректный пароль.
4. Нажать кнопку "Войти".
Ожидаемый результат: Система отображает сообщение об ошибке "Неправильный пароль".
01 Jan, 16:10
01 Jan, 09:10
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8
POST
, PUT
, PATCH
. Тело запроса может содержать данные формы, JSON, XML, файлы и другие типы данных.{
"username": "exampleUser",
"password": "examplePassword"
}
POST /login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Content-Type: application/json
Content-Length: 48
{
"username": "exampleUser",
"password": "examplePassword"
}
31 Dec, 16:10
31 Dec, 09:10
30 Dec, 16:10
30 Dec, 09:10
29 Dec, 16:10
29 Dec, 09:10
28 Dec, 16:10
28 Dec, 09:10
27 Dec, 16:10
27 Dec, 09:10
26 Dec, 16:10
26 Dec, 09:10
25 Dec, 09:10
24 Dec, 16:10
24 Dec, 09:10
23 Dec, 16:10
23 Dec, 09:10
22 Dec, 16:10
22 Dec, 09:10
21 Dec, 16:10