2017-09-30 8 views
2

Nous utilisons Travis CI pour maintenir notre projet sur git. La question est ici Travis nous avons 2 processus en cours d'exécution d'une sélection aléatoire de caractéristiques chacun avec un nombre différent de semences, maintenant quand il y a un échec, j'essaie de courir:Rspec ne peut pas reproduire les échecs même avec des commandes de reproduction minimales à partir de la bissectrice

  1. la spécification exacte du nombre de graines
  2. la spécification exacte sans le nombre de graines
  3. le fichier de spécification avec un certain nombre de graines
  4. le fichier de spécification avec un certain nombre de graines et --bisect
  5. le fichier spec sans numéro de graines, mais avec --bisect

Dans les 5 scénarios ci-dessus, que ce soit localement ou même sur un SSH lors du débogage de la construction travis, je ne trouve pas d'échecs et la coupure échoue toujours. Egalement dans un scénario complètement différent si je cours en parallèle: spec localement avec les 8 processus par défaut, j'obtiens des échecs mais si je cours chacun seul avec le 'rspec' cmd, ne donne pas d'échecs.

J'ai aussi essayé localement d'exécuter parallel: spec tout en ayant l'option --bisect dans le fichier .parallel-spec à la racine de notre application. les commandes de reproduction minimales que je reçois ne donnent toujours pas d'échecs.

Qu'est-ce qui me manque ici? ce problème est-il lié à l'exécution de plusieurs processus et à l'exécution des lignes de reproduction minimales avec rspec? Parce que actuellement, il me semble que si les spécifications sont exécutées sur plus d'un processus, je ne suis jamais capable de reproduire les spécifications défaillantes. D'un autre côté si localement je lance rspec --bisect après 8 heures je trouve qu'il n'a pas encore démarré 1 processus même et je suis sur un macbook pro (mais oui nous avons environ 4k specs)

p.s. nous sommes sur des rails 4.2.7.1, rubis 2.3.3 et 3.4.4 rspec

Merci

Mise à jour: couru spec parallèle verbeux pour obtenir l'ordre de spécifications, puis a couru la commande de processus dans lequel une spécification échoue le numéro de graine puis une autre fois avec le numéro de graine et --bisect. toujours pas d'échecs.

Répondre

0

Parmi ces 5 choses que vous essayez, je ne vois pas Try to run all the specs from the process with the seed

Il est possible que vos spécifications interfèrent les uns avec les autres et si spec A est exécutée avant spec B forcera B échouer ... Ou même si A est exécuté avant B il peut provoquer l'échec de C. Donc, si vous exécutez toutes les spécifications d'un processus avec la graine - peut-être que vous allez reproduire l'échec - seulement alors vous exécutez la même chose avec --bisect pour trouver le plus petit ensemble qui vous donne l'échec.

Si vous ne pouvez pas le reproduire de cette façon - je peux voir une autre option: vos spécifications parallèles utilisent des ressources partagées (DB, fichiers?) Et les échecs sont causés par des conditions de course. Ceux-ci sont difficiles à trouver - en particulier parmi les spécifications. Assurez-vous que chaque processus utilise réellement un DB distinct (des erreurs simples, comme oublier de changer database.yml peut causer cela).

Si cela ne vous aide pas - vérifiez votre code pour d'autres ressources partagées possibles. Vous n'avez pas mentionné le nombre de spécifications qui échouent habituellement. Si c'est un petit nombre - vous pouvez vous concentrer sur ceux-ci.

+0

Merci.En fait, j'ai seulement essayé hier d'exécuter les spécifications du processus avec la graine et aussi une autre fois avec la graine et le bisect mais toujours pas d'échecs, j'ai mis à jour cette partie dans ma question tout à l'heure. En ce qui concerne les échecs ils sont malheureusement malheureusement chaque fois que je les lance en parallèle quelque chose de nouveau échoue et j'ai d'abord abordé la plupart de ces échecs aléatoires individuellement, tout semble s'effondrer lorsque je cours en parallèle seulement ce qui me conduit à une conclusion que cela pourrait être à cause de la sécheresse dans les fichiers spec. – Shalaby

+0

J'ai examiné la base de données chaque processus voit une base de données distincte comme prévu. Je pense qu'en termes de processus parallèles, chaque spécification doit être isolée avec ses propres objets et ne pas avoir les objets déclarés globalement et utilisés par toutes les spécifications. Je vais devoir refactoriser probablement toutes les spécifications mais je suis arrivé ici de l'article de Bakir sur l'exécution parallèle: https://www.atlantbh.com/blog/parallel-test-execution/ maintenant je ne partage pas exactement les fichiers entre les spécifications mais je partage des objets. Je vais devoir tester cette théorie et commencer à refactoriser je suppose – Shalaby

+0

Comment partagez-vous les objets entre les processus? – meta