Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Ejercicios: Testing, Variables Globales y Estructura de Código

Pruebas unitarias, eliminación de variables globales, análisis de flujo y buenas prácticas

Universidad Nacional de Río Negro

Acerca de

El testing y el diseño estructurado de código son disciplinas indispensables para asegurar la confiabilidad de los programas en C. En este bloque no solo vas a escribir código nuevo, sino también a leer, analizar, depurar y refactorizar programas existentes.

Aprenderás a identificar el impacto negativo de las variables globales mutables, diseñar suites de pruebas unitarias automatizadas con assert(), analizar la cobertura de ramas de ejecución y aplicar las reglas de estilo institucional (Allman, contratos y desacoplamiento de entrada/salida).

Capítulos de Apunte Correspondientes

Prerrequisitos Conceptuales

Antes de resolver esta guía, el estudiante debe dominar:

  1. Pruebas unitarias basadas en aserciones (assert) y patrón Arrange-Act-Assert (AAA) (Testing y Verificación Básica).

  2. Regla institucional de funciones puras desacopladas de E/S (0x2002h: Las funciones no deben contener printf o scanf, a menos que ese sea su propósito explícito).

  3. Prohibición estricta de variables globales mutables y paso explícito de contexto (0x2004h: No se permite el uso de variables globales).

  4. Estructuración de runners y métricas de prueba mediante códigos de retorno en main.

Cuestiones de Estilo Aplicables


1. Conceptos Fundamentales de Testing y Aserciones

Ejercicio 1.06.01 - Anatomía de una aserción ⭐☆☆☆☆


Ejercicio 1.06.02 - Patrón AAA (Arrange - Act - Assert) ⭐☆☆☆☆


Ejercicio 1.06.03 - Refactorización de pruebas acumuladas ⭐⭐☆☆☆


Ejercicio 1.06.04 - Efectos colaterales prohibidos dentro de assert ⭐⭐☆☆☆


Ejercicio 1.06.05 - Particiones de Equivalencia ⭐⭐☆☆☆


Ejercicio 1.06.06 - Análisis de Valores de Borde (Boundary Values) ⭐⭐☆☆☆


Ejercicio 1.06.07 - Comparación de punto flotante en testing ⭐⭐☆☆☆


Ejercicio 1.06.08 - Aserciones defensivas vs Validación de Usuario ⭐☆☆☆☆


Ejercicio 1.06.09 - Función pura para cálculo de descuento ⭐⭐☆☆☆


Ejercicio 1.06.10 - Estructura de Runner de Tests sin bibliotecas ⭐⭐☆☆☆


2. Variables Globales y Efectos Colaterales

Ejercicio 1.06.11 - El misterio del test que falla según el orden ⭐⭐⭐☆☆


Ejercicio 1.06.12 - Sombreado de Variables (Shadowing) ⭐⭐☆☆☆


Ejercicio 1.06.13 - Refactorización de Cuenta Bancaria con Estado Global ⭐⭐⭐☆☆


Ejercicio 1.06.14 - Clasificación de funciones: Puras vs Impuras ⭐⭐☆☆☆


Ejercicio 1.06.15 - Variable static local vs Variable Global ⭐⭐⭐☆☆


Ejercicio 1.06.16 - Modificación inadvertida de bandera global ⭐⭐☆☆☆


Ejercicio 1.06.17 - Acoplamiento espurio entre módulos ⭐⭐⭐☆☆


Ejercicio 1.06.18 - Conversor de Temperaturas desacoplado de estado ⭐⭐☆☆☆


Ejercicio 1.06.19 - Simulación de cronómetro sin estado global ⭐⭐⭐☆☆


Ejercicio 1.06.20 - Detección de fugas de estado entre funciones ⭐⭐☆☆☆


Ejercicio 1.06.21 - Calculadora con memoria local vs global ⭐⭐⭐☆☆


Ejercicio 1.06.22 - Máquina de Estados Finita Pura ⭐⭐⭐☆☆


3. Lectura, Análisis y Flujo de Control

Ejercicio 1.06.23 - Cobertura de Ramas (Branch Coverage) ⭐⭐☆☆☆


Ejercicio 1.06.24 - Detección de Código Muerto (Dead Code) ⭐⭐☆☆☆


Ejercicio 1.06.25 - Cortocircuito Lógico y Orden de Evaluación ⭐⭐☆☆☆


Ejercicio 1.06.26 - Cláusulas de Guarda vs Código en Flecha ⭐⭐☆☆☆


Ejercicio 1.06.27 - Detección de Fallthrough accidental en switch ⭐⭐☆☆☆


Ejercicio 1.06.28 - Detección de Error Off-by-one en Lazos ⭐⭐☆☆☆


Ejercicio 1.06.29 - Desacople de Entrada/Salida para Testabilidad ⭐⭐⭐☆☆


Ejercicio 1.06.30 - Tabla de Traza de Ejecución (Trace Table) ⭐⭐☆☆☆


Ejercicio 1.06.31 - Principio de Responsabilidad Única (SRP) ⭐⭐☆☆☆


Ejercicio 1.06.32 - Testeo de Año Bisiesto Exhaustivo ⭐⭐☆☆☆


Ejercicio 1.06.33 - Detección de mutación en arreglos de solo lectura ⭐⭐☆☆☆


Ejercicio 1.06.34 - Búsqueda de errores lógicos con aserciones de invariante ⭐⭐⭐☆☆


4. Estilo, Estructura y Contratos

Ejercicio 1.06.35 - Verificación de Estilo Allman ⭐☆☆☆☆


Ejercicio 1.06.36 - Eliminación de Números Mágicos ⭐⭐☆☆☆


Ejercicio 1.06.37 - Documentación de Contratos con Doxygen ⭐⭐☆☆☆


Ejercicio 1.06.38 - Inicialización obligatoria de variables ⭐☆☆☆☆


Ejercicio 1.06.39 - Organización de Archivo .c Estándar ⭐☆☆☆☆


Ejercicio 1.06.40 - Red de Seguridad: Default en Switch ⭐⭐☆☆☆


Ejercicio 1.06.41 - Nombres de Variables Autoexplicativos ⭐☆☆☆☆


Ejercicio 1.06.42 - Prohibición de Reutilización de Variables ⭐⭐☆☆☆


Ejercicio 1.06.43 - Flags de Compilación Obligatorios ⭐☆☆☆☆


Ejercicio 1.06.44 - Funciones Auxiliares Privadas static ⭐⭐☆☆☆


5. Suites de Pruebas Integradoras y Diagnóstico

Ejercicio 1.06.45 - Suite de Pruebas: Validador de Fecha ⭐⭐⭐☆☆


Ejercicio 1.06.46 - Suite de Pruebas: Tarifa de Estacionamiento ⭐⭐⭐☆☆


Ejercicio 1.06.47 - Diagnóstico de Aserción Fallida ⭐⭐☆☆☆


Ejercicio 1.06.48 - Test de Regresión ⭐⭐☆☆☆


Ejercicio 1.06.49 - Suite de Pruebas: Desglose de Billetes ⭐⭐⭐☆☆


Ejercicio 1.06.50 - Suite de Pruebas: Validador de Números Primos ⭐⭐⭐☆☆


Ejercicio 1.06.51 - Testeo de Funciones con Códigos de Error ⭐⭐⭐☆☆


Ejercicio 1.06.52 - Suite de Pruebas: Palíndromo Numérico ⭐⭐☆☆☆


Ejercicio 1.06.53 - Suite de Pruebas: Validador de Triángulo ⭐⭐⭐☆☆


Ejercicio 1.06.54 - Suite de Pruebas: Conversión de Segundos a Tiempo ⭐⭐☆☆☆


Ejercicio 1.06.55 - Suite Integradora de Evaluación de Sistema de Calificaciones ⭐⭐⭐☆☆


Notas Finales