D Language
Examen de la unidad
Buscar..
Sintaxis
- unittest {...} - un bloque que solo se ejecuta en modo "unittesting"
- assert (<expresión que se evalúa como booleano>, <mensaje de error opcional>)
Bloques unittest
Las pruebas son una excelente manera de garantizar aplicaciones estables y libres de errores. Sirven como una documentación interactiva y permiten modificar el código sin temor a romper la funcionalidad. D proporciona una sintaxis conveniente y nativa para el bloque unittest
como parte del lenguaje D. Los bloques unittest
en cualquier lugar de un módulo D pueden usarse para probar la funcionalidad del código fuente.
/**
Yields the sign of a number.
Params:
n = number which should be used to check the sign
Returns:
1 for positive n, -1 for negative and 0 for 0.
*/
T sgn(T)(T n)
{
if (n == 0)
return 0;
return (n > 0) ? 1 : -1;
}
// this block will only be executed with -unittest
// it will be removed from the executable otherwise
unittest
{
// go ahead and make assumptions about your function
assert(sgn(10) == 1);
assert(sgn(1) == 1);
assert(sgn(-1) == -1);
assert(sgn(-10) == -1);
}
Ejecutando test unit
Si el indicador -unittest
se pasa al compilador D, ejecutará todos los bloques de -unittest
. A menudo es útil dejar que el compilador genere una función main
aplastada. Usando el compilador y ejecute wrapper rdmd
, probar su programa D es tan fácil como:
rdmd -main -unittest yourcode.d
Por supuesto, también puede dividir este proceso en dos pasos si desea:
dmd -main -unittest yourcode.d
./yourcode
Para proyectos de dub
, compilar todos los archivos y ejecutar sus bloques de prueba de unidad se puede hacer de manera conveniente con
dub test
Consejo profesional: define `tdmd` como alias de shell para guardar las propinas.
alias tdmd="rdmd -main -unittest"
y luego prueba tus archivos con:
tdmd yourcode.d
Prueba de unidad anotada
Para el código con plantilla, a menudo es útil verificar que los atributos de la función (por ejemplo, @nogc
se deducen correctamente. Para garantizar esto para una prueba específica y, por lo tanto, escribir todo el test de unidad puede anotarse)
@safe @nogc pure nothrow unittest
{
import std.math;
assert(exp(0) == 1);
assert(log(1) == 0);
}
Tenga en cuenta que, por supuesto, en D, cada bloque se puede anotar con atributos y los compiladores, por supuesto, verifican que sean correctos. Entonces, por ejemplo, lo siguiente sería similar al ejemplo anterior:
unittest
{
import std.math;
@safe {
assert(exp(0) == 1);
assert(log(1) == 0);
}
}