Mettez-vous des tests unitaires dans le même projet ou dans un autre projet?

137

Mettez-vous des tests unitaires dans le même projet pour plus de commodité ou les placez-vous dans un assemblage séparé?

Si vous les placez dans un assemblage séparé comme nous le faisons, nous nous retrouvons avec un certain nombre de projets supplémentaires dans la solution. C'est idéal pour les tests unitaires lors du codage, mais comment publier l'application sans tous ces assemblages supplémentaires?

Léora
la source

Réponses:

100

À mon avis, les tests unitaires devraient être placés dans un assemblage distinct du code de production. Voici quelques inconvénients du placement de tests unitaires dans le même assembly ou assemblys que le code de production:

  1. Les tests unitaires sont livrés avec le code de production. La seule chose livrée avec le code produit est le code de production.
  2. Les assemblages seront inutilement gonflés par les tests unitaires.
  3. Les tests unitaires peuvent affecter les processus de construction comme la construction automatisée ou continue.

Je ne connais pas vraiment de pros. Avoir un projet supplémentaire (ou 10) n'est pas un inconvénient.

Edit: Plus d'informations sur la construction et l'expédition

Je recommanderais en outre que tout processus de construction automatisé place la production et les tests unitaires dans différents endroits. Dans l'idéal, le processus de génération de test unitaire ne s'exécute que si le code de production est généré et copie les fichiers du produit dans le répertoire des tests unitaires. En procédant de cette façon, les bits réels sont séparés pour l'expédition, etc. De plus, il est assez simple d'exécuter des tests unitaires automatisés à ce stade sur tous les tests d'un répertoire particulier.

Pour résumer, voici l'idée générale d'une construction quotidienne, de tests et d'expédition de bits et autres fichiers:

  1. La génération de production s'exécute, plaçant les fichiers de production dans un répertoire "production" spécifique.
    1. Créez uniquement des projets de production.
    2. Copiez les bits compilés et autres fichiers dans un répertoire "production".
    3. Copiez les bits et autres fichiers dans un répertoire de release candidate, alias un répertoire de release de Noël serait "Release20081225".
  2. Si la génération de production réussit, la génération de test unitaire s'exécute.
    1. Copiez le code de production dans le répertoire "tests".
    2. Créez des tests unitaires dans le répertoire "tests".
    3. Exécutez des tests unitaires.
  3. Envoyez des notifications de build et des résultats de tests unitaires aux développeurs.
  4. Lorsqu'une version candidate (telle que Release20081225) est acceptée, expédiez ces bits.
Jason Jackson
la source
15
OMI, les inconvénients que vous énumérez ne sont pas toujours applicables. Un avantage pour le même projet est de regrouper plus facilement des tests de classe + testés - ces petites commodités sont très utiles lors de l'écriture de tests. La préférence personnelle l'emporte ici, et parfois vos points sont pertinents, mais pas tout le temps.
orip
7
Vous devez d'abord demander si vous devez supprimer les tests lors de l'expédition. Si oui, vous avez besoin d'un projet séparé. Sinon, utilisez les autres avantages et inconvénients pour décider. Les personnes qui supposent qu'elles ne peuvent pas déployer les tests arriveront toujours à la conclusion "projet séparé" par défaut.
orip
7
Je ne vois aucun avantage à expédier du code non-production comme les tests unitaires, et il y a beaucoup d'inconvénients. L'expédition de tests unitaires signifie que vous avez affaire à plus de bits qui doivent être distribués. Les tests unitaires ont également un ensemble distinct de dépendances. Maintenant, vous expédiez NUnit, Rhino ou Moq, etc. C'est encore plus de ballonnement. Placer des tests unitaires dans un projet séparé ne nécessite qu'un petit effort, et c'est un coût unique. Je suis très à l'aise avec la conclusion que les tests unitaires ne devraient pas être expédiés.
Jason Jackson
4
Comme alternative à l'approche «projet séparé» pour supprimer les tests unitaires dans le code de production, pensez à utiliser un symbole personnalisé et des directives de compilateur comme #if. Ce symbole personnalisé peut être basculé à l'aide des paramètres de ligne de commande du compilateur dans vos scripts logiciels CI. Voir msdn.microsoft.com/en-us/library/4y6tbswk.aspx .
Rich C
23
.NET est en retard sur la réalisation de tests dans un projet complètement séparé, et je parie que cela changera bientôt. Il n'y a aucune raison pour que le processus de construction ne puisse pas ignorer le code de test dans la version de version. J'ai utilisé plusieurs générateurs d'applications Web qui font cela. Je pense qu'il est absolument préférable d'inclure les fichiers de code de test unitaire juste à côté des fichiers de code qu'ils décrivent, répartis dans la même hiérarchie de fichiers. Google recommande cela, appelé l'organisation de fichiers «fractale». Pourquoi les tests sont-ils différents des commentaires en ligne et de la documentation Lisez-moi? Le compilateur ignore volontiers ce dernier.
Brandon Arnold
112

Projet séparé, mais dans la même solution. (J'ai travaillé sur des produits avec des solutions séparées pour le code de test et de production - c'est horrible. Vous basculez toujours entre les deux.)

Les raisons des projets séparés sont celles exposées par d'autres. Notez que si vous utilisez des tests basés sur les données, vous risquez de vous retrouver avec une quantité assez importante de ballonnement si vous incluez les tests dans l'assemblage de production.

Si vous avez besoin d'accéder aux membres internes du code de production, utilisez InternalsVisibleTo .

Jon Skeet
la source
+1: Je viens de rencontrer des tests unitaires dans le même projet que le code principal et il est difficile de trouver les tests parmi le vrai code - même si une convention de dénomination a été suivie.
Fenton
32
Pour un lecteur moins expérimenté, cela signifie que vous ajoutez [assembly:InternalsVisibleTo("UnitTestProjectName")]à votre AssemblyInfo.csfichier de projet .
Margus
Ajout très utile Margus. Merci à Jon d'avoir mentionné InternalsVisibleTo dans ce contexte.
Bjørn Otto Vasbotten
1
@jropella: si vous signez l'assembly prod, vous ne pouvez de toute façon rendre les composants internes visibles que pour les assemblys signés. Et bien sûr, si vous exécutez du code en toute confiance, ils y ont accès par réflexion ...
Jon Skeet
2
@jropella: Reflection ne se soucie pas d'InternalsVisibleTo de toute façon ... mais vous n'auriez pas vu un assembly signé approuver un assembly non signé en utilisant InternalsVisibleTo, car cela est empêché au moment de la compilation.
Jon Skeet
70

Je ne comprends pas l'objection fréquente au déploiement de tests avec du code de production. J'ai dirigé une équipe sur une petite microcap (passée de 14 à 130 personnes). Nous avions une demi-douzaine d'applications Java et nous avons trouvé EXTRÊMEMENT appréciable de déployer des tests sur le terrain pour les exécuter sur un spécifiquemachine qui présentait un comportement inhabituel. Des problèmes aléatoires se produisent sur le terrain et pouvoir lancer quelques milliers de tests unitaires au mystère sans coût était inestimable et souvent diagnostiqué des problèmes en quelques minutes ... y compris des problèmes d'installation, des problèmes de RAM floconneux, des problèmes spécifiques à la machine, des problèmes de réseau irréguliers, etc, etc. Je pense qu'il est extrêmement précieux de faire des tests sur le terrain. En outre, des problèmes aléatoires surgissent à des moments aléatoires et il est agréable d'avoir les tests unitaires assis là déjà en attente d'être exécutés à tout moment. L'espace sur le disque dur est bon marché. Tout comme nous essayons de garder les données et les fonctions ensemble (conception OO), je pense qu'il y a quelque chose de fondamentalement précieux à garder le code et les tests ensemble (fonction + tests qui valident les fonctions).

Je voudrais mettre mes tests dans le même projet en C # /. NET / Visual Studio 2008, mais je n'ai pas encore suffisamment étudié cela pour y parvenir.

Un grand avantage de garder Foo.cs dans le même projet que FooTest.cs est que les développeurs sont constamment rappelés lorsqu'une classe manque un test frère! Cela encourage de meilleures pratiques de codage basées sur les tests ... les trous sont plus apparents.


la source
17
Je peux voir comment le serait utile avec les tests d'intégration, mais pour les tests unitaires? Si vous les écrivez correctement, ils ne devraient avoir aucune dépendance sur la machine.
Joel McBeth
+1 Je suis d'accord. Comme je fais principalement .NET, les tests d'expédition avec le code de production ont également pour effet secondaire de réduire l'étape d'intégration continue de la compilation et du test: 1) Seulement la moitié des projets à construire, 2) tous les assemblys de test à la place de l'application principale il est donc plus facile de paramétrer votre testeur. Lors de l'utilisation de Maven, cet argument ne tient pas, bien sûr. Enfin, mes clients sont des gens plus techniques et ils aiment vraiment pouvoir exécuter les tests eux-mêmes, car cela documente l'état actuel par rapport aux spécifications.
mkoertgen
Je pense qu'il peut être parfaitement logique de faire des tests d'intégration dans le style TDD / BDD, c'est-à-dire d'écrire du code de test qui peut être facilement automatisé avec des exécuteurs de test standard comme NUnit, xUnit, etc. Bien sûr, vous ne devez pas mélanger l'unité avec des tests d'intégration. Assurez-vous simplement de savoir quel ensemble de tests exécuter rapidement et souvent pour la vérification de compilation (BVT) et lesquels pour les tests d'intégration.
mkoertgen
1
Les gens s'y opposent parce que ce n'est pas ce à quoi ils sont habitués. Si leur première expérience de test unitaire était qu'ils étaient dans le code de production, en fait, avec une syntaxe spécifique dans le langage de programmation qui indiquait ce qu'un test est associé à une méthode de production, ils jureraient que c'était un aspect inestimable du flux de travail de développement. et c'est absolument fou de les mettre dans un projet séparé. La plupart des développeurs sont comme ça. Suiveurs.
zumalifeguard
19

Placez les tests unitaires dans le même projet que le code pour obtenir une meilleure encapsulation.

Vous pouvez facilement tester des méthodes internes, ce qui signifie que vous ne rendrez pas publiques des méthodes qui auraient dû être internes.

C'est aussi très agréable d'avoir les tests unitaires proches du code que vous écrivez. Lorsque vous écrivez une méthode, vous pouvez facilement trouver les tests unitaires correspondants car ils se trouvent dans le même projet. Lorsque vous créez un assembly qui inclut unitTests, toute erreur dans unitTest vous donnera une erreur de compilation, vous devez donc garder votre unittest à jour, juste pour construire. Avoir unittest dans un projet séparé peut amener certains développeurs à oublier de construire le projet unittest et à manquer les tests interrompus pendant un certain temps.

Et vous pouvez supprimer les tests unitaires du code de production, en utilisant des balises de compilation (IF #Debug).

Les tests d'intégration automatique (réalisés sur NUnit) doivent être dans un projet séparé car ils n'appartiennent à aucun projet unique.

Jenspo
la source
1
Mais cela signifie que vous ne pouvez pas exécuter de tests sur la Releaseconstruction et que peu de "heisenbugs" peuvent échouer.
hIpPy
3
Avec des assemblys amis ( msdn.microsoft.com/en-us/library/0tke9fxk.aspx ), l'utilisation InternalsVisibleTovous permet de tester des méthodes internes à partir d'un projet de test
séparé
3
@hlpPy - vous pouvez configurer des symboles de compilation conditionnels arbitraires et vous pouvez avoir plus de 2 configurations de construction. Par exemple; vous pourriez avoir Debug, Approvalet Release; et compilez l'approbation avec toutes les optimisations de version. En outre, les tests unitaires ne sont généralement pas excellents pour détecter les heisenbugs en premier lieu (d'après mon expérience). Vous avez tendance à avoir besoin de tests de régression d'intégration spécifiques pour ceux-ci - et vous pouvez très bien les placer côte à côte.
Eamon Nerbonne
Un projet séparé donne la même erreur de compilation. Si vous avez besoin d'approfondir le code, vous aurez plus besoin de plus d'abstractions que de tests unitaires de piratage dans votre code. Se fier aux conditions dans votre code pour changer de branche n'est pas non plus une bonne chose. On dirait plus que les tests unitaires et intégrations sont confus.
Nick Turner
12

Après avoir passé du temps dans des projets TypeScript, où les tests sont souvent placés dans un fichier à côté du code qu'ils testent, j'ai grandi en préférant cette approche à leur séparation:

  • Il est plus rapide de naviguer vers le fichier de test.
  • Il est plus facile de se souvenir de renommer les tests lorsque vous renommez la classe testée.
  • Il est plus facile de se souvenir de déplacer les tests lorsque vous déplacez la classe testée.
  • Il est immédiatement évident si une classe manque de tests.
  • Vous n'avez pas besoin de gérer deux structures de fichiers en double, une pour les tests et une pour le code.

Ainsi, lorsque j'ai récemment lancé un nouveau projet .NET Core, je voulais voir s'il était possible d'imiter cette structure dans un projet C # sans expédier les tests ou les assemblys de test avec la version finale.

Jusqu'à présent, l'insertion des lignes suivantes dans le fichier de projet semble bien fonctionner:

  <ItemGroup Condition="'$(Configuration)' == 'Release'">
    <Compile Remove="**\*.Tests.cs" />
  </ItemGroup>
  <ItemGroup Condition="'$(Configuration)' != 'Release'">
    <PackageReference Include="nunit" Version="3.11.0" />
    <PackageReference Include="NUnit3TestAdapter" Version="3.12.0" />
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.9.0" />
  </ItemGroup>

Ce qui précède garantit que dans la Releaseconfiguration tous les fichiers nommés*.Tests.cs sont exclus de la compilation, et également que les références de package de test unitaire requises sont supprimées.

Si vous voulez toujours pouvoir tester les unités dans leur configuration de version, vous pouvez simplement créer une nouvelle configuration dérivée de Releaseappelé quelque chose comme ReleaseContainingTests.


Mise à jour: après avoir utilisé cette technique pendant un certain temps, j'ai également trouvé qu'il était utile de personnaliser vos icônes dans VS Code pour que les tests (et d'autres choses) se démarquent un peu plus dans le volet de l'explorateur:

Capture d'écran VS Code

Pour ce faire, utilisez l'extension Material Icon Theme et ajoutez quelque chose comme ce qui suit à vos préférences VS Code JSON:

"material-icon-theme.files.associations": {
  "*.Tests.cs": "test-jsx",
  "*.Mocks.cs": "merlin",
  "*.Interface.cs": "yaml",
}
James Thurley
la source
Exactement ce que nous venons de commencer
Matthew Steeples
Cela fonctionne-t-il également pour les bibliothèques de classes standard .net?
Zenuka le
10

Mes tests unitaires vont toujours dans un projet séparé. En fait, pour chaque projet que j'ai dans ma solution, il y a un projet de test séparé qui l'accompagne. Le code de test n'est pas du code d'application et ne doit pas être mélangé avec lui. Un avantage à les conserver dans des projets séparés - au moins en utilisant TestDriven.Net - est que je peux cliquer avec le bouton droit sur un projet de test et exécuter tous les tests de ce projet, en testant une bibliothèque entière de code d'application en un seul clic.

Tvanfosson
la source
1
Alors, comment testez-vous les classes internes des unités? Ou testez-vous uniquement les classes publiques?
user19371
7
<assembly: InternalsVisibleTo = "TestProject" /> si nécessaire, bien que je ne teste généralement que les interfaces publiques.
tvanfosson
@tvanfosson, que faites-vous avec Specs (Specflow)? Auriez-vous un projet séparé ou les mettriez-vous dans le projet de test unitaire? +1.
w0051977
@ w0051977 Je n'ai jamais utilisé Specflow donc je ne sais pas
tvanfosson
@tvanfosson, qu'en est-il des tests d'intégration? Souhaitez-vous les mettre dans un projet séparé pour les tests unitaires?
w0051977
10

Si le framework NUnit est utilisé, il y a une raison supplémentaire de placer les tests dans le même projet. Prenons l'exemple suivant du code de production mélangé à des tests unitaires:

public static class Ext
{
     [TestCase(1.1, Result = 1)]
     [TestCase(0.9, Result = 1)]
     public static int ToRoundedInt(this double d)
     {
         return (int) Math.Round(d);
     }
}

Les tests unitaires ici servent de documentation et de spécification du code testé. Je ne sais pas comment obtenir cet effet d'auto-documentation, les tests étant situés dans un projet séparé. L'utilisateur de la fonction devrait rechercher les tests pour voir ces cas de test, ce qui est peu probable.

Mise à jour : je sais qu'une telle utilisation de l' TestCaseattribut n'était pas l'intention des développeurs de NUnit, mais pourquoi pas?

Andrej Adamenko
la source
2
J'aime cette idée; avoir quelques exemples d'entrées et de sorties attendues avec le code.
Preston McCormick
3

Je fluctue entre le même projet et différents projets.

Si vous publiez une bibliothèque, publier le code de test avec le code de production est un problème, sinon je trouve que ce n'est généralement pas le cas (bien qu'il y ait une forte barrière psychologique avant d'essayer).

Lorsque je place des tests dans le même projet, je trouve qu'il est plus facile de basculer entre les tests et le code qu'ils testent, et plus facile de les refactoriser / les déplacer.

orip
la source
3

Je les mets dans des projets séparés. Le nom de l'assemblage reflète celui des espaces de noms, en règle générale pour nous. Donc, s'il existe un projet appelé Company.Product.Feature.sln, il a une sortie (nom d'assembly) de Company.Product.Feature.dll. Le projet de test est Company.Product.Feature.Tests.sln, produisant Company.Product.Feature.Tests.dll.

Il est préférable de les conserver dans une solution unique et de contrôler la sortie via le Gestionnaire de configuration. Nous avons une configuration nommée pour chacune des branches principales (développement, intégration, production) au lieu d'utiliser le débogage et la publication par défaut. Une fois que vous avez configuré vos configurations, vous pouvez ensuite les inclure ou les exclure en cliquant sur la case à cocher "Construire" dans le Gestionnaire de configuration. (Pour obtenir le Gestionnaire de configuration, cliquez avec le bouton droit sur la solution et accédez à Configuration Manager.) Notez que je trouve que le CM dans Visual Studio est parfois bogué. Plusieurs fois, j'ai dû aller dans les fichiers du projet et / ou de la solution pour nettoyer les cibles qu'il avait créées.

De plus, si vous utilisez Team Build (et je suis sûr que les autres outils de build .NET sont identiques), vous pouvez alors associer la build à une configuration nommée. Cela signifie que si vous ne générez pas vos tests unitaires pour votre build "Production", par exemple, le projet de build peut également être conscient de ce paramètre et ne pas les générer car ils ont été marqués comme tels.

De plus, nous avions l'habitude de faire des dépose XCopy de la machine de construction. Le script omettrait simplement de copier tout ce qui est nommé * .Tests.Dll du déploiement. C'était simple, mais cela fonctionnait.

Joseph Ferris
la source
1

Je dirais de les garder séparés.

En plus des autres raisons mentionnées, le fait d'avoir du code et des tests ensemble biaise les numéros de couverture des tests. Lorsque vous signalez la couverture des tests unitaires, la couverture signalée est plus élevée car les tests sont couverts lorsque vous exécutez des tests unitaires. Lorsque vous signalez la couverture des tests d'intégration, la couverture signalée est inférieure car les tests d'intégration n'exécutent pas de tests unitaires.

Sébastien K
la source
Cela ne dépend-il pas de la technologie utilisée pour couvrir les tests? Je veux dire, OpenCover considère les lignes de code couvertes si elles sont exécutées par un test, y compris les lignes du test lui-même, de sorte que si les tests ont des exceptions inattendues, elles sont également marquées comme non couvertes.
Isaac Llopis
0

Je suis vraiment inspiré par le framework de test unitaire de la bibliothèque Flood NN de Robert Lopez. Il utilise un projet différent pour chaque classe testée unitaire et possède une solution contenant tous ces projets, ainsi qu'un projet principal qui compile et exécute tous les tests.

Le truc sympa est aussi la mise en page du projet. Les fichiers source se trouvent dans un dossier, mais le dossier du projet VS se trouve ci-dessous. Cela vous permet de créer différents sous-dossiers pour différents compilateurs. Tous les projets VS sont livrés avec le code, il est donc très facile pour quiconque d'exécuter tout ou partie des tests unitaires.


la source
0

Je sais que c'est une question très ancienne, mais je voudrais ajouter mon expérience là-bas, j'ai récemment changé l'habitude de test unitaire de projets séparés à un même.

Pourquoi?

Premièrement, je suis très enclin à garder la même structure de dossier de projet principal avec le projet de test. Donc, si j'ai un fichier sous, Providers > DataProvider > SqlDataProvider.csje crée la même structure dans mes projets de test unitaire commeProviders > DataProvider > SqlDataProvider.Tests.cs

Mais une fois que le projet devient de plus en plus gros, une fois que vous déplacez des fichiers d'un dossier à un autre, ou d'un projet à un autre, il devient très fastidieux de les synchroniser avec les projets de test unitaire.

Deuxièmement, il n'est pas toujours très facile de naviguer de la classe à tester à la classe de test unitaire. C'est encore plus difficile pour JavaScript et Python.

Récemment, j'ai commencé à pratiquer cela, chaque fichier que j'ai créé (par exemple SqlDataProvider.cs ) je crée un autre fichier avec le suffixe Test, commeSqlDataProvider.Tests.cs

Au début, il semble que cela gonflera les fichiers et les références de bibliothèque, mais à long terme, vous éliminerez le syndrome des fichiers en mouvement à première vue, et vous vous assurerez également que chaque fichier qui est candidat au test aura un fichier paire avec .Tests suffixe. Il vous permet de sauter facilement dans le fichier de test (car il est côte à côte) au lieu de parcourir un projet séparé.

Vous pouvez même écrire des règles métier pour parcourir le projet et identifier la classe qui n'a pas de fichier .Tests, et les signaler au propriétaire. Vous pouvez également indiquer facilement à votre testeur de cibler les .Testsclasses.

Surtout pour Js et Python, vous n'aurez pas besoin d'importer vos références à partir d'un chemin différent, vous pouvez simplement utiliser le même chemin du fichier cible en cours de test.

J'utilise cette pratique depuis un certain temps et je pense que c'est un compromis très raisonnable entre la taille du projet par rapport à la maintenabilité et la courbe d'apprentissage pour les nouveaux arrivants au projet.

Shipahi Teoman
la source
Je ne suis pas d'accord. Il est beaucoup plus organisé pour regrouper les éléments que pour tester des classes individuelles. Si vous testez vos fournisseurs; Vous auriez un IProvider, ISqlProvider et un MockSqlConnection. Dans un dossier de fournisseur, vous auriez le test unitaire pour chaque fournisseur. Vous pouvez aller jusque-là dans les tests unitaires, mais vous venez d'écrire des tests et non du code et pouvez même supprimer le pro et commencer à écrire du code à tester.
Nick Turner
0

Comme d'autres l'ont répondu - mettez des tests dans des projets séparés

Une chose qui n'a pas été mentionnée est le fait que vous ne pouvez pas exécuter nunit3-console.execontre autre chose que des .dllfichiers.

Si vous prévoyez d'exécuter vos tests via TeamCity, cela posera un problème.

Disons que vous avez un projet d'application console. Lorsque vous compilez, il renvoie un exécutable .exedans le bindossier.

À partir de, nunit3-console.exevous ne pourrez pas exécuter de tests définis dans cette application console.

En d'autres termes, une application console renvoie un exefichier et une bibliothèque de classes renvoie des dllfichiers.

Je viens de me faire mordre aujourd'hui et ça craint :(

Canyon de Kolob
la source
0

J'ai récemment déployé dans docker. Je ne vois pas l'intérêt d'avoir un projet séparé lorsque le Dockerfile peut facilement copier le répertoire / src et quitter le répertoire / test. Mais je suis nouveau sur dotnet et il me manque peut-être quelque chose.

MikeF
la source
-2

Projets séparés, bien que je débatte avec moi-même s'ils doivent partager le même svn. Pour le moment, je leur donne des dépôts svn séparés, un appelé

"MyProject" - pour le projet lui-même

et un appelé

"MyProjectTests" - pour les tests associés à MyProject.

Ceci est assez propre et présente l'avantage que les engagements dans le projet et les engagements aux tests sont assez séparés. Cela signifie également que vous pouvez remettre le svn du projet si nécessaire, sans avoir à publier vos tests. Cela signifie également que vous pouvez avoir des répertoires branch / trunk / tag pour vos tests et pour votre projet.

Mais je suis de plus en plus enclin à avoir quelque chose comme ce qui suit, dans un seul référentiel svn, pour chaque projet.

Mon projet
| \ Tronc
| | \ Code
| \ Tests
| \ Balises
| | \ 0,1
| | | \ Code
| | \ Tests
| \ 0,2
| | \ Code
| \ Tests
\Branches
  \ MyFork
   | \ Code
    \Tester

Je serais intéressé de savoir ce que les autres pensent de cette solution.

sampablokuper
la source
5
Vous ne devriez pas avoir besoin de commits séparés pour le code de test et d'application. Ils devraient aller de pair et les validations impliqueraient les deux, surtout si vous utilisez une conception de style * DD.
eddiegroves