Comment écrire un test unitaire pour un chronomètre?

J’ai une classe qui mesure le temps entre l’appel et le Start . J’ai créé un test unitaire qui utilise boost::this_thread::sleep entre Start et Stop et je boost::this_thread::sleep que le résultat est proche de l’heure à laquelle j’ai dormi.

Cependant, ce test échoue sur notre agent de construction, mais pas sur nos machines de développement. Le problème est le suivant: comment savoir s’il s’agit d’un problème réel du chronomètre ou s’il s’agit d’un “problème” que l’agent de compilation (exécutant d’autres processus, étant une machine virtuelle) pourrait dormir plus longtemps que je ne le lui avais demandé?

La question est donc la suivante: existe-t-il un moyen efficace d’écrire quelque chose comme “Faites quelque chose qui prend exactement x secondes?”

Merci beaucoup!

Il n’y a aucun moyen de tester quelque chose comme ça de manière fiable sur un système non temps réel. La solution consiste à encapsuler les API pour obtenir l’heure système utilisée par votre chronomètre et à les simuler dans les tests.

Prenez le temps système avant et après le sumil et référez-vous uniquement à la différence entre ces moments et le moment où vous avez dormi.

Quelle est la résolution de votre chronomètre? Si vous devez être précis au bout de quelques secondes, vous devez dormir pendant 3 secondes et voir si vous êtes entre 2,9 et 3,1. Si vous avez besoin d’une précision de mili / nano seconde, vous devez simplement utiliser des simulations d’horodatage comme suggéré dans la première réponse.

Cela dépend du système d’exploitation que vous utilisez. Sur les systèmes prenant en charge la multi-programmation, le temps d’exécution de votre thread n’est pas déterministe. Sur certains systèmes en temps réel, cependant, il est presque exact que votre thread soit prioritaire. Vous devriez pouvoir désactiver l’interruption pour simuler ce cas, car votre thread ne sera pas préempté par le programmateur du système d’exploitation.