Code de test d'expédition. Pourquoi pas toi?


17

Je tiens à expédier code de test à côté d'un produit. Plus précisément, fournir une option de sorte que toute personne ayant une copie de notre programme peut frapper une « auto-test » bouton ou passer --self-test sur la ligne de commande et de course à travers la suite complète de l'unité | tests d'intégration.

Je veux surtout faire pour soutenir problèmes de mise au point découverts sur le terrain, alors quand un rapport de bogue est déposé À partir de l'utilisateur final, il y a une chance de celui-ci étant pris en charge par « ainsi que, ces trois résultats non conformes sur mon ordinateur ». J'aimerais que les testeurs manuels puissent faire fonctionner l'unité | tests d'intégration également.

Cependant, le test de l'équipe estime que le code de test n'est pas un code de production et ne doit donc pas être expédié. Je ne comprends pas vraiment cet argument, car la plupart des projets open source livrent une suite de tests. Cela semble inhabituel dans un logiciel fermé.

Je voudrais preuves à l'appui ou anecdotes de part et d'autre de l'argument. Je l'ai pris mon mieux deviner quel site d'échange de la pile serait plus approprié, mais s'il vous plaît laissez-moi savoir si cela est hors de propos.


8
Pourquoi dans un programme de code source fermé serait un test de l' unité (ou un programme opensource qui n'a pas été modifiée) jamais manquer? Si votre produit nécessite une bonne quantité de configuration et que les problèmes de configuration sont souvent à l'origine de bogues, il peut être judicieux de livrer une sorte d'application "valider ma configuration" qui fait des choses comme valider la connexion à la base de données, valider les connexions à tout autre service externe votre code dépend, etc. Il ne serait pas logique pour un test unitaire pour toujours échouer, cependant, puisque vous avez déjà validé le fonctionnement du code.
Justin Cave


15
Pourquoi un test unitaire échouerait-il sur le terrain? Du haut de ma tête: programme corrompu. Matériel douteux. Conditions de course que nous n'avons pas vues localement. Lié à une bibliothèque dynamique différente. Conflits avec antivirus ou OS. Être utilisé avec une surprenante version logicielle liée due à la mise à jour incomplète. L'interaction avec d'autres processus ne se comporte pas comme prévu. Il y a des tas de raisons pour lesquelles des bogues apparaissent sur le terrain, et beaucoup d'entre eux pourraient être détectés lors d'un test unitaire (pour une définition donnée de l'unité)
Jon Chesterfield

7
@JonChesterfield: la création d'une fonction d'autotest dans votre programme est probablement une bonne chose. Et si cette fonction d'autotest peut partiellement réutiliser le code de vos tests unitaires, pourquoi pas? Mais une telle fonctionnalité et les pièces réutilisables doivent être mis au point avec un « il est le code de production » point de vue.
Doc Brown

2
@JonChesterfield J'ai du mal à imaginer un test d'unité défectueuse sur la plupart de ces causes. Les tests d'intégration sont une autre question, mais - je peux voir mérite les expédier si elle peut se faire sans trop de choses supplémentaires.
Loren Pechtel

Réponses:


19

Parfois, le code de test contient des extraits de code provenant de tiers, externes et internes à votre entreprise. Cela se produit lorsque les utilisateurs signalent des bogues; vos tests (tests de régression) puis incorporer le code fourni par les reproduire. Souvent, l'autorisation de ces bouts de code pour reproduire les bugs ne sait pas. , Vous devez être conscient des problèmes de propriété intellectuelle. Vous ne voulez pas envoyer le code de test qui révèle accidentellement des secrets commerciaux ou la propriété intellectuelle d'un autre département de votre société ou de vos partenaires externes soit.

Sur un autre plan, le code de test est rarement soumis à des normes de code de production: revues de code ne sont pas nécessairement fait; normes de codage non appliquées, etc. C'est regrettable, mais courant, et ne devrait pas nécessairement avoir une mauvaise image de l'équipe de test si elle n'avait pas cet objectif en place au moment où ces tests ont été développés.

D'autre part, de nombreux tests sont tout simplement embarrassante mauvaise, et ne testent même pas ce que certains pensent est d'être test. C'est différent question ...

En fin de compte, en raison de tous ces facteurs, vous voudrez peut-être classer vos tests comme ceux qui peuvent être expédiés en open source et ceux qui ne le peuvent tout simplement pas. (Vous pouvez écrire des tests personnalisés avec les expédier à l' esprit, la migration lentement les autres dans cet ensemble.)


La question tiers est un très bon point. Le regroupement du code de test en "visible de l'extérieur" et "peut-être confidentiel" serait source d'erreurs et représenterait une surcharge considérable. C'est à peu près un casse-tête à lui tout seul, merci.
Jon Chesterfield

Oui, difficile à faire après les faits. Je pense que vous auriez plus de chance avec un effort particulier pour développer des tests d' expédition.
Erik Eidt

@ErikEidt: Je pris la liberté de faire une suggestion pour éliminer « open source », parce que c'est peut - être pas ce que l'OP avait à l' esprit - je pense qu'il veut expédier les essais comme sources fermés.
Doc Brown

@DocBrown, je vous comprends . Peut - être une question d'interprétation de l'OP a mentionné quelque part « libre » dans le message. Dans tous les cas votre modification généralise le point gentiment.
Erik Eidt

18

essais d'expédition? Oui. Expédition tests unitaires? Non.

Comme vous le dites dans le commentaire, problème que vous pourriez rencontrer lors de l'exécution du produit sur un ordinateur client comprendra des problèmes tels que la liaison avec le mauvais dll, ce qui est généralement quelque chose d'un test de l'unité attrapera (qui n'ont raillé doute le hors dll pour tester le code).

Maintenant, la livraison d'une suite de tests d'intégration, qui appelle l'interface utilisateur qui appelle la logique qui appelle la DLL ... qui fonctionnera beaucoup mieux. Les tests d'intégration peuvent montrer d'autres aspects des installations qui ont échoué que les tests unitaires ne se présentent pas. (Par exemple mon produit courant demande une installation de codecs K-lite, dont nous ne sommes pas autorisés à grouper en raison de la licence. Tests unitaires peuvent montrer notre code fin de travail, mais ne fonctionne toujours pas à la satisfaction des clients. De la même façon, notre configuration des codecs peut-être pas travaillé correctement, les tests unitaires ne montre pas non plus que vers le haut).

Alors - expédier certains de vos tests d'intégration plutôt, ce qui serait exactement ce que vous voulez pour une installation, intégrée, produit.


2

Je pourrais comprendre fortement cette préoccupation dans les domaines où vous couvrez chaque pouce du matériel, comme un moteur de jeu AAA de nouvelle génération multithread qui utilise chaque cœur de processeur, les intrinsèques SIMD, les GPU, GPGPU, etc. tout en fournissant une plateforme multiplateforme produit.

Dans ces cas, votre pire cauchemar sera souvent les cas où vos tests (unité et intégration) passeront pour les 5 000 premières machines / plates-formes disparates testées, mais échouent pour le 5 001ème en raison d'un bug de pilote pour un modèle de GPU obscur. A propos de ce qui me donne la chair de poule - vous ne pouvez pas peut-être tester ou prévoir celles-ci à l'avance.

Bien que cela devienne de moins en moins comme jouer au démineur ces jours-ci, cela devrait donner aux gens une idée: http://theorangeduck.com/page/writing-portable-opengl . Un essai en fin des années 90 et début des années 2000. était vraiment horrible, il était démineur complètement.

Pour ces types de cas, vous avez souvent besoin d'équipes de plus de 10000 testeurs avec une très large gamme de matériel et de systèmes d'exploitation pour vraiment solidifier le produit et avoir confiance en lui avant une version stable.

Ce que je recommande dans ce cas est ce que les autres ont suggéré, se concentrer sur un ensemble distribué des tests d'intégration.

Une autre chose (si vous pouvez convaincre le patron) est d'avoir un grand nombre de matériel disponible pour faire l'intégration contiguës. La plus grande variété de combos matériel / OS, le plus joyeux. Vous voulez encore une variété de matériel de merde qui modélise la configuration matérielle de minimum pour les serveurs de CI: on ne sait jamais.

Mais il y a encore une chose que je suggérerais:

Enregistrement

Si vous avez affaire à quelque chose comme le scénario que j'ai décrit ci-dessus, alors vous ne pouvez souvent pas tester ces choses qui ont tendance à être les plus problématiques (les pires pièges possibles qui apparaissent au pire moment possible et ne peuvent pas apparaître même dans le la plupart suite de tests exhaustive puisqu'il est question contraint à une combinaison matériel / OS très spécifique).

Pourtant, la plupart de ce genre de questions telles que les incompatibilités de matériel peu courant ou pilote pure et simple des pépins ou les enchaîner contre le mauvais dylib (je ne suis jamais fait face à ce problème) ne vous mènera bien au-delà la mise en service du logiciel.

Vous ne pouvez rien faire contre ces choses que vous ne pouvez pas tester de manière exhaustive.

En règle générale ici, la meilleure chose que nous pouvons faire est de trouver le problème le plus rapidement possible, où elle se produit plus détaillé possible (pour restreindre la liste des suspects) et ont fixé la question dès que possible après qu'il est rapporté.

Dans ce cas, l'exploitation forestière peut être une bouée de sauvetage. Pour ce genre de champs, vous pouvez créer ces livrets techniques spammy lequel personne ne lirait jamais à travers. Souvent concerné est juste la dernière ligne enregistré dans le journal avant que l'utilisateur fait face à un accident en raison d'un pépin de pilote, par exemple, vous pouvez écrire un processus externe ou crochet moniteurs pour les accidents et montre puis la dernière ligne du journal que les utilisateurs peuvent copier et collez-le, par exemple en plus d'un vidage sur incident.

Comme il a souvent besoin d'information granulaire et beaucoup de zones les plus sensibles dans le code à ces matériel / plateforme / problèmes de pilote est la performance critique, il y a cette question embarrassante où l'exploitation forestière peut se produire à un rythme fréquent que ça va réellement lent sur le logiciel.

A useful trick in this case is to rely on the assumption that something executed once will execute successfully the second time, third time, etc. This is not the most sound assumption, but it's often "good enough" (and infinitely better than nothing) . Avec cela, vous pouvez utiliser une petite partie de l'État externes pour suivre quand quelque chose a été enregistré déjà et ignorez les tentatives ultérieures de journal pour les cas vraiment granulaires dont le code est invoquée à plusieurs reprises dans une boucle.

Quoi qu'il en soit, j'espère que cela. I've run into this kind of temptation in the past and have a bit of a paranoia surrounding GPU coding (GPGPU and shaders) as a result of some past experiences among myself and my team (sometimes just seeing other team members deal with these really fin et après la libération m'a donné la chair de poule, comme un petit problème ATI Radeon sur un modèle spécifique qui échouerait sur le rendu anticrénelage de lignes, a rapporté plus tard et marqué comme un problème connu avec seulement une solution de contournement disponible).

L' exploitation forestière était la chose qui a sauvé les fesses là - bas, nous laisser voir souvent la question sur cette machine prototype obscure 10001e avec un GPU à bord nous jamais entendu parler, à la dernière ligne de code immédiatement nous faire repérer exactement où l'échec est en baisse de 2 ou 3 lignes de code suspecte, par exemple , si elle est à l' intérieur d' un shaders élaboré, nous sommes en quelque sorte SOL puisque nous ne pouvons pas l' exploitation forestière dans un shader GPU, mais nous pouvons au moins l' exploitation forestière utilisent pour voir lequel shader avait la question tout de suite commencer l'enquête.


2
Memoizing le code d'enregistrement est malin. Intégrer des tests de diagnostic avec l'installateur est une bonne idée aussi. Merci pour la réponse détaillée.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.