Comment testez-vous un logiciel sensible au temps?

9

Par temps sensible, je veux dire par exemple un script qui ne s'exécute qu'une fois par mois ou un script qui s'exécute en continu mais qui ne donne une certaine sortie qu'une fois par mois. De toute évidence, vous pouvez effectuer des tests unitaires pour de nombreux cas, mais il existe des exceptions (à ma connaissance).

Un exemple récent que j'ai rencontré était la mise en place d'un travail cron à exécuter de l'avant-dernier jour de chaque mois. Cela nécessitait l'utilisation d'un script shell avec l'onglet cron pour obtenir le bon jour du mois pour cron, quelque chose comme:

1 0 [shell command] * * [my script]

Je ne connaissais pas le script et je ne connaissais pas les scripts shell en général et je n'avais donc aucun bon moyen de le tester à part attendre la fin du mois pour voir si le script s'exécutait correctement (en fait, ma solution était de trouver un co- travailleur qui en savait beaucoup plus sur les scripts cron et shell que je faisais).

Je suis donc curieux de savoir s'il existe des solutions utiles pour tester les scripts sensibles au facteur temps.

DanLeaningphp
la source
3
Vous pouvez l'exécuter sur une machine virtuelle et définir l'heure du système sur une heure pratique, comme juste minuit avant le jour où le script doit s'exécuter, ou quelque chose comme ça.
Vitor Py
2
crontab exécute des scripts shell réguliers, vous pouvez simplement exécuter le script à la main (dans un bac à sable ou vm si vous avez peur de ce qu'il fera) sans attendre crontab
crasic
2
Ma réponse est peut-être exagérée pour votre cas spécifique: exécutez simplement le script. Mais la question plus large aurait besoin de solutions comme la virtualisation et l'instrumentation.
Macneil

Réponses:

7

En plus des tests unitaires, il existe deux autres stratégies pour configurer des tests automatisés pour traiter un problème spécifique au système d'exploitation:

  • Virtualisation : vous configurez plusieurs images de système d'exploitation (par exemple, à l'aide de VMWare ) avec les configurations exactes dont vous avez besoin, définissez un moyen d'extraire automatiquement le binaire à tester (généralement en montant un répertoire spécial dans l'espace de la machine virtuelle), puis exécutez le tester.

Ou:

  • Instrumentation : ajoutez manuellement des ifconditions spéciales à votre programme pour que le programme se comporte différemment. Sous Unix, cela se ferait en vérifiant si une certaine variable d'environnement est définie, comme FOOBAR_TEST_TIME_WITH_T=500. Vos tests automatisés utiliseront alors simplement différents paramètres des variables d'environnement et différentes variables d'environnement pour exécuter ce dont vous avez besoin.

Vous pouvez également créer des liens vers différentes bibliothèques, si vos interactions peuvent être exprimées au niveau de la bibliothèque, que vous pouvez considérer comme une virtualisation (si la «bibliothèque» est le noyau du système d'exploitation) ou comme une technique d'instrumentation. Les deux termes peuvent être utilisés, bien que le terme virtualisation tel qu'il est utilisé aujourd'hui signifie presque toujours quelque chose comme VMWare. Une bibliothèque spécifiquement pour renvoyer des valeurs prédéfinies ou relancer des interactions spécifiques serait une approche simulée ou tronquée .

Il existe également des outils d'instrumentation automatique, qui peuvent réécrire vos binaires pour obtenir d'autres effets souhaités, comme le système de fichiers étant plein.

Dans l'ensemble, votre objectif est de trouver des bogues. Pour vérifier des cas étranges comme le système de fichiers étant trop plein, il est plus simple et toujours efficace d'instrumenter manuellement votre programme, en passant rarement par la virtualisation ou la configuration manuelle de la machine.

Macneil
la source
Je pense que votre «virtualisation de bibliothèque» est mieux connue sous le nom de moquerie, ou plutôt, en utilisant une bibliothèque factice.
Javier
10

Le plus efficace - Modifiez la date de la machine sur laquelle vous testez. Réglez-le un peu avant quand il doit s'exécuter et vérifiez quand il démarre et qu'il fonctionne correctement. Cependant, cela n'est pas toujours possible si plusieurs machines sont impliquées ou si des ressources sont nécessaires sur lesquelles votre entreprise n'a aucun contrôle. Cependant, assurez-vous de le faire pendant plusieurs mois et changez l'année plusieurs fois pour tester février.

Lyndon Vrooman
la source
1
si vous avez installé un logiciel avec une licence (n évaluation) pour une durée limitée, le bricolage de l'horloge peut les amener à bloquer leur exécution.
Marjan Venema
Dans certaines entreprises, tous les postes de travail connectés au réseau ne doivent pas s'écarter de l'heure du "serveur" de 5 minutes, sinon le poste de travail se verrouille. Cela m'est arrivé :-)
OnesimusUnbound
1

Je ne connais pas votre script, mais j'essaie d'utiliser une sorte de paramètre où je peux régler la date. Dans votre cas, si aucune date n'est indiquée, par défaut à la fin du mois. Dans votre code, prenez le paramètre date et exécutez si aujourd'hui est deux jours avant. Non seulement vous pourrez le tester (passer une date dans deux jours), mais aussi l'exécuter le lendemain au cas où quelque chose l'empêcherait de fonctionner dans des circonstances normales (panne de courant, panne de serveur, etc.).

JeffO
la source
1

Puisque vous avez mentionné crontab, je suppose que vous utilisez un environnement nix. Dans ce cas, je pense que cela vaut la peine de consulter libfaketime:
http://www.code-wizards.com/projects/libfaketime/

Grâce à la magie de LD_PRELOAD, nous pouvons charger des versions personnalisées des fonctions de bibliothèque tant qu'elles correspondent à l'interface. Ce que libfaketime fait, c'est charger des versions des appels système de temps qui vous permettent de personnaliser leur comportement via des variables d'environnement. Vous pouvez forcer time () à renvoyer une valeur codée en dur ou un décalage par rapport à l'heure actuelle, le tout sans affecter personne d'autre sur la boîte.

Frankc
la source
0

Il n'est pas nécessaire de tester cron, car il a été à peu près testé ("test de production") pendant de nombreuses générations. Bien sûr, si vous travaillez avec un script shell, vous pouvez définir la date / l'heure dans une machine virtuelle.

La façon préférée de gérer cela est de "se moquer de l'horloge", en utilisant une astuce de programmation ou une autre pour truquer l'heure. Dans les scripts shell, vous pouvez utiliser la syntaxe $ {: -} pour utiliser une date définie dans une variable d'environnement et retomber sur l'heure réelle si elle n'a pas été forcée.

Dans d'autres langues, nous utilisons des bibliothèques fictives ou construisons une abstraction au fil du temps.

L'horloge factice est bonne car vous pouvez l'automatiser au lieu d'avoir à configurer manuellement votre test. C'est un très grand avantage quand il s'agit de modifier le script / code plus tard et vous pouvez facilement dire s'il fonctionne toujours ou non.

Tim Ottinger
la source