Testing
Testing Fundamental Multilenguaje 2025 Prácticas y Ejemplos
🧪 Testing Fundamental Multilenguaje 2025: Prácticas y Ejemplos
Guía completa de prácticas y ejemplos de testing en JavaScript/TypeScript, Python, Java y C#, cubriendo todos los conceptos fundamentales y patrones de 2025.
🧩 1. Conceptos Fundamentales
- Propósito del Testing: Asegurar calidad, confiabilidad y mantenibilidad.
- Principios Clave:
- Detectar errores temprano.
- Reducir riesgos y costos.
- Facilitar refactoring seguro.
- Mantener tests rápidos y claros.
⚙️ 2. Patrones de Tests
AAA (Arrange – Act – Assert)
// JavaScript (Jest)
describe('Calculator', () => {
it('adds numbers correctly', () => {
// Arrange
const a = 2, b = 3;
// Act
const result = a + b;
// Assert
expect(result).toBe(5);
});
});
`
# Python (pytest)
def test_add():
a, b = 2, 3
result = a + b
assert result == 5
✅ Prácticas
- Separar claramente preparación, ejecución y validación.
- Nombrar los tests de forma natural y descriptiva.
- Evitar dependencias externas innecesarias.
🧪 3. Unit Testing
JS/TS – Jest
import { sum } from './math';
test('sum returns correct result', () => {
expect(sum(2, 3)).toBe(5);
});
Python – pytest
def multiply(a, b):
return a * b
def test_multiply():
assert multiply(2, 3) == 6
Java – JUnit 5
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MathTest {
@Test
void testSum() {
assertEquals(5, 2 + 3);
}
}
C# – NUnit
using NUnit.Framework;
[TestFixture]
public class MathTests {
[Test]
public void TestAdd() {
Assert.AreEqual(5, 2 + 3);
}
}
✅ Buenas Prácticas
- Aislar dependencias (mocks/stubs).
- Probar casos normales y límite.
- Mantener tests rápidos (<1s).
🔗 4. Integration Testing
JS – Supertest
import request from 'supertest';
import app from '../app';
test('POST /login returns token', async () => {
const res = await request(app)
.post('/login')
.send({ email: 'test@test.com', password: '1234' });
expect(res.status).toBe(200);
expect(res.body.token).toBeDefined();
});
Python – pytest + requests
import requests
def test_login_endpoint():
res = requests.post('http://localhost:5000/login', json={'email': 'test@test.com', 'password': '1234'})
assert res.status_code == 200
assert 'token' in res.json()
Java – REST Assured
given()
.contentType("application/json")
.body("{\"email\":\"test@test.com\",\"password\":\"1234\"}")
.when()
.post("/login")
.then()
.statusCode(200)
.body("token", notNullValue());
C# – RestSharp + NUnit
var client = new RestClient("http://localhost:5000/login");
var request = new RestRequest(Method.POST);
request.AddJsonBody(new { email = "test@test.com", password = "1234" });
IRestResponse response = client.Execute(request);
Assert.AreEqual(200, (int)response.StatusCode);
✅ Tips
- Usar bases de datos temporales o contenedores.
- Limpiar datos tras cada test.
- Simular servicios externos.
🌐 5. API Testing & Contract Testing
JS – Pact (Contract)
const { Pact } = require('@pact-foundation/pact');
- Garantiza que los microservicios cumplan contratos.
- Integración CI/CD para pruebas continuas.
Python – requests + pytest
def test_api_contract():
res = requests.get('http://api.example.com/products')
assert res.status_code == 200
assert isinstance(res.json(), list)
🧠 6. Test Driven Development (TDD)
Flujo: Red → Green → Refactor
JS – Jest
function sum(a, b) { return a + b; }
test('adds two numbers', () => {
expect(sum(2,3)).toBe(5);
});
Python – pytest
def test_sum():
assert 2 + 3 == 5
✅ Prácticas
- Escribir test antes del código.
- Refactorizar con seguridad.
- Tests pequeños y claros.
🧩 7. Behavior Driven Development (BDD)
Cucumber – Gherkin
Feature: Login
Scenario: Usuario inicia sesión
Given el usuario existe con email "test@test.com"
When envía POST a "/login"
Then recibe código 200 y token JWT
✅ Tips
- Facilita colaboración QA-Dev-Product.
- Escenarios claros y comprensibles.
🧪 8. E2E Testing
JS – Playwright
import { test, expect } from '@playwright/test';
test('login flow', async ({ page }) => {
await page.goto('https://app.example.com');
await page.fill('#email', 'test@test.com');
await page.fill('#password', '1234');
await page.click('button[type="submit"]');
await expect(page.locator('h1')).toHaveText('Bienvenido');
});
Python – Selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://app.example.com")
driver.find_element_by_id("email").send_keys("test@test.com")
driver.find_element_by_id("password").send_keys("1234")
driver.find_element_by_tag_name("button").click()
assert "Bienvenido" in driver.page_source
driver.quit()
✅ Consejos
- Usar entornos staging o mockeados.
- Evitar tests frágiles.
- Integrar en CI/CD.
⚙️ 9. Mocking y Stubbing
JS – Jest
jest.mock('axios');
axios.get.mockResolvedValue({ data: { name: 'Eduardo' } });
Python – unittest.mock
from unittest.mock import patch
@patch('module.requests.get')
def test_mock(mock_get):
mock_get.return_value.json.return_value = {'name': 'Eduardo'}
Java – Mockito
UserService mockService = mock(UserService.class);
when(mockService.getUser(1)).thenReturn(new User("Eduardo"));
C# – Moq
var mock = new Mock<IUserService>();
mock.Setup(x => x.GetUser(1)).Returns(new User("Eduardo"));
📊 10. Cobertura y Calidad
JS – Jest
npx jest --coverage
Python – coverage.py
coverage run -m pytest
coverage report
Java – JaCoCo
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
C# – Coverlet
dotnet test /p:CollectCoverage=true
🔥 11. Performance & Load Testing
JS – k6
import http from 'k6/http';
import { check } from 'k6';
export default function () {
let res = http.get('https://api.example.com/products');
check(res, { 'status is 200': (r) => r.status === 200 });
}
Java – JMeter (CLI)
jmeter -n -t test_plan.jmx -l results.jtl
🧭 12. Security & Accessibility
JS – axe-core (Accessibility)
import AxeBuilder from '@axe-core/playwright';
Security – OWASP ZAP CLI
zap-cli quick-scan http://localhost:3000
🧩 13. Test Data & Fixtures
JS – Faker
import { faker } from '@faker-js/faker';
faker.name.firstName();
faker.internet.email();
Python – Faker
from faker import Faker
fake = Faker()
fake.name()
fake.email()
✅ Buenas prácticas
- Evitar datos reales.
- Generar datos consistentes.
- Reutilizar fixtures.
📌 Conclusión
Este documento abarca todos los conceptos fundamentales de testing 2025:
- Unit, Integration, API, E2E.
- TDD, BDD, Mocking, Coverage.
- Performance, Security y Test Data.
- Multilenguaje: JS/TS, Python, Java, C#.
- Buenas prácticas y patrones AAA, Setup/Teardown, CI/CD.
Base sólida para avanzar hacia testing avanzado, observability, AI-assisted testing y microservicios.
¿Te gusta este contenido? Suscríbete vía RSS