Exercices de programmation mono fichier et multi-fichier

Nowledgeable met à disposition des assertions pour réaliser des exercices dans différents langages.

Python

Utilisation de la classe AnswerTester

La classe AnswerTester fournit des méthodes pour écrire des assertions et tester les codes des étudiants.

Elle possède les méthodes suivantes :

add_assert

La méthode add_assert permet de tester une assertion arbitraire. L'expression passée doit simplement évaluer à True ou False.

La seconde option avec la fonction lambda permet d'éviter une erreur si la variable testée n'a pas été créée par l'étudiant

Il existe trois manières d'écrire ces tests unitaires :

La fonction compare_functions permet de vérifier qu'une fonction renvoie une valeur donnée.

tester.compare_functions("test add", add, solution_function_add, add_inputs)

compare_variables

La fonction compare_variable permet de vérifier qu'une variable a une valeur donnée.

tester.compare_variable("a should be equal to 3", a, 3)

was_function_called_with

Cette assertion permet de vérifier qu'une fonction spécifique a été utilisée par l'étudiant avec des paramètres spécifiques. Utile pour tester l'usage de fonctions tierces qui n'ont pas de retour (model.fit, plt.plot, etc.)

Le code suivant vérifie que l'étudiant a bien appelé la fonction print avec un argument valant 2

tester.was_function_called_with("print(2)", "print", [2])

C

Assertions disponibles

Les assertions suivantes sont disponibles pour tester le code C :

assert_true

Permet de vérifier qu'une variable a une valeur attendue.

void main(){ start_test(); assert_true("a is greater than 2", a > 2); end_test(); }

Assertion d'égalité

Permet de vérifier que deux expressions ont les mêmes valeurs

  • assert_int_equals
  • assert_float_equals
void main(){ start_test(); assert_int_equals("test description", expected_int, actual_int); assert_float_equals("test description", expected_float, actual_float); assert_string_equals("test description", expected_string, actual_string); end_test(); }

Assertion sur stdout

Permet de vérifier que le stdout contient une valeur donnée.

Penser à utiliser init_stdout_capture et reset_stdout_capture pour que le stdout soit capturé

void test(){ start_test(); init_stdout_capture(); //appel de la fonction à tester assert_stdout_contains("the stdout contains 1,2,3", "1,2,3"); reset_stdout_capture(); end_test(); }

Générateurs de valeurs aléatoires

Les fonctions suivantes facilitent la génération de valeurs aléatoires afin de rendre les tests plus robustes

// Génère un entier aléatoire entre min et max inclus int generate_random_int(int min, int max); // Génère un float aléatoire entre min et max inclus float generate_random_float(float min, float max); // Génère un tableau de n_values floats aléatoires float* generate_random_float_array(float min, float max, int n_values); // Génère un tableau de n_values entiers aléatoires int* generate_random_int_array(float min, float max, int n_values); // Génère une matrice d'entiers aléatoires int** generate_random_int_matrice(int val_min, int val_max, int n_row, int n_col);