Marcos E. Haase
Estoy tratando de seguir junto con el tutorial oficial de cheques, pero requiere un conocimiento práctico de Autotools, que no tengo. Tenía la esperanza de escribir un par de pruebas rápidas, y este tutorial me parece abrumador. Se basa en mucha magia en Autoconf, Automake y algunas macros de verificación. No explica cómo funciona realmente Check para que pueda crear pruebas a mano.
¿Cómo puedo usar Check sin Autotools?
estilo libre
Ciertamente, no necesita aprender herramientas automáticas para usar Check en proyectos pequeños. Digamos que nuestro main() está en main.c y nuestro deployment.c tiene una función que suma 2 enteros. (implementation.h contiene solo el prototipo de función)
#include "implementation.h"
int sum(int a, int b) {
return a + b;
}
Puedes escribir una prueba así:
#include "implementation.h"
#test sum2test
fail_unless(sum(3, 2) == 5, "sum function borked");
fail_unless(sum(-3, 2) == -1, "sum function borked");
fail_unless(sum(3, -2) == 1, "sum function borked");
fail_unless(sum(-3, -2) == -5, "sum function borked");
Guarde el archivo en deployment-test.check (puede elegir cualquier nombre/extensión que desee, pero quédese con ellos si desea seguir mi guía) y luego ejecute el script awk incluido que viene con Check. ¡Ni siquiera tiene que molestarse con el código repetitivo para el marco de verificación! (para más detalles man checkmk)
checkmk implementation-test.check >implementation-test.c
La salida será la siguiente:
/*
* DO NOT EDIT THIS FILE. Generated by checkmk.
* Edit the original source file "implementation-test.check" instead.
*/
#include <check.h>
#line 1 "implementation-test.check"
#include "implementation.h"
START_TEST(sum2test)
{
#line 4
fail_unless(sum(3, 2) == 5, "sum function borked");
fail_unless(sum(-3, 2) == -1, "sum function borked");
fail_unless(sum(3, -2) == 1, "sum function borked");
fail_unless(sum(-3, -2) == -5, "sum function borked");
}
END_TEST
int main(void)
{
Suite *s1 = suite_create("Core");
TCase *tc1_1 = tcase_create("Core");
SRunner *sr = srunner_create(s1);
int nf;
suite_add_tcase(s1, tc1_1);
tcase_add_test(tc1_1, sum2test);
srunner_run_all(sr, CK_ENV);
nf = srunner_ntests_failed(sr);
srunner_free(sr);
return nf == 0 ? 0 : 1;
}
¡Luego simplemente incluya -lcheck cuando compile para vincular la biblioteca de verificación y ejecutar el programa!
gcc -Wall -o sum2ints-test implementation.c implementation-test.c -lcheck
./sum2ints
A continuación se muestra un archivo MAKE simple para que pueda comenzar. Guárdelo en sum2ints.makefile y luego para compilar deployment.c junto con main, ejecute:
make -f sum2ints.makefile
Para compilar y ejecutar deployment.c con nuestro deployment-test.c que se creó a partir de checkmk, ejecute:
make -f sum2ints.makefile test
–
CFLAGS=-Wall
LIBS=-lcheck
all: sum2ints
sum2ints: main.o implementation.o
gcc -o sum2ints main.o implementation.o
main.o: main.c implementation.h
gcc $(CFLAGS) -c main.c
implementation.o: implementation.c implementation.h
gcc $(CFLAGS) -c implementation.c
test: sum2ints-test
./sum2ints-test
sum2ints-test: implementation-test.o implementation.o
gcc -o sum2ints-test implementation.o implementation-test.o $(LIBS)
implementation-test.o: implementation-test.c implementation.h
gcc $(CFLAGS) -c implementation-test.c
He preparado un archivo .zip para usted que contiene todo lo anterior.
-
En Debian “Jessie” necesitaba vincular bibliotecas adicionales:
LIBS=-lcheck -lm -lpthread -lrt
– Mateusz Charytoniuk
25 de diciembre de 2013 a las 17:27
-
¡Gracias! Al principio aprendí a usar la verificación con herramientas automáticas, pero para proyectos más pequeños, ¡tu tutorial es genial!
– Grigori
17 de enero de 2015 a las 8:31
-
checkmk
se ve genial, pero no necesariamente viene concheck
, es un proyecto aparte.– rampanion
18 de enero de 2015 a las 2:40
-
Usando “GNU Make 3.81” y “gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4”, obtengo referencias indefinidas a floor, __pthread_register_cancel, timer_create, timer_settime y timer_delete a menos que agregue -pthread y -lm argumentos @freestyler
– JeffH
26 de junio de 2016 a las 17:32
-
@JeffH, para usted y otras personas que tienen problemas en Ubuntu, puede averiguar qué necesita agregar adicionalmente con
pkg-config --cflags --libs check
que probablemente devolverá algo como-pthread -pthread -lcheck_pic -lrt -lm
Utilice esta cadena completa en lugar de la del autor.-lcheck
.– skelliam
19 de octubre de 2016 a las 1:21
Merlijn Sebrechts
La respuesta de @freestyler es buena, pero aún usa checkmk
que no es necesario.
Este es un ejemplo mínimo sin usar checkmk
.
Ponga lo siguiente en un archivo llamado test.c
:
#include <check.h>
START_TEST (sanity_check)
{
fail_unless(5 == 5, "this should succeed");
fail_unless(6 == 5, "this should fail");
}
END_TEST
int main(void)
{
Suite *s1 = suite_create("Core");
TCase *tc1_1 = tcase_create("Core");
SRunner *sr = srunner_create(s1);
int nf;
suite_add_tcase(s1, tc1_1);
tcase_add_test(tc1_1, sanity_check);
srunner_run_all(sr, CK_ENV);
nf = srunner_ntests_failed(sr);
srunner_free(sr);
return nf == 0 ? 0 : 1;
}
y compilar con
gcc test.c -Wall -o test -lcheck -pthread -lcheck_pic -pthread -lrt -lm -lsubunit
-
Esto es genial. No entiendo por qué en los documentos no proporcionan un ejemplo de caso más simple. En cualquier caso, hice que esto funcionara pero tuve algunos errores al compilar con algunas de las opciones que usaste (soy un principiante total de C, así que no estoy seguro de cuáles son algunas de estas opciones). Independientemente, para mí funciona con: gcc test.c -Wall -o test -lcheck -pthread -pthread -lm
– Aarón
29 de marzo a las 5:25
Edité la pregunta, creo que ahora se puede volver a abrir, pero no tengo claro cómo hacerlo.
– Merlijn Sebrechts
25 de agosto de 2020 a las 20:17
@MerlijnSebrechts Requiere suficiente reputación (o ser el cartel original). Estoy de acuerdo, así que voté para reabrir ahora.
– hyde
26 de agosto de 2020 a las 4:09
Gracias por la limpieza @MerlijnSebrechts. También he votado para reabrir.
–Mark E. Haase
26 de agosto de 2020 a las 18:19