web-dev-qa-db-fra.com

Comment configurer des tests unitaires dans Unity et corriger l'erreur de référence d'assemblage manquante?

J'ai créé la structure suivante:

├── Assets
├── Scenes
├── Scripts
│   └── MyExample.cs
├── Tests
│   ├── MyExampleTest.cs
│   └── Tests.asmdef

Maintenant, lorsque je clique sur Tout exécuter, dans la fenêtre Test Runner, dans Unity, le message d'erreur suivant s'affiche:

The type or namespace name `MyExample' could not be found. Are you missing an Assembly reference?

Dans Visual Studio, j'ai deux projets:

  • Assembly-CSharp (contenant src)

  • Tests (contenant des tests)

J'ai ajouté Assembly-CSharp comme référence dans le deuxième projet. Visual Studio est capable de générer la solution sans erreur.

Est-ce que quelqu'un sait comment configurer correctement une régression UnitTest pour un projet Unity?

C'est Tests.asmdef

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

MyExampleTest.cs

using UnityEngine;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using abc;

public class MyExampleTest{

    [Test]
    public void NewTestScriptSimplePasses() {
        // Use the Assert class to test conditions.
    }

    [UnityTest]
    public IEnumerator NewTestScriptWithEnumeratorPasses() {
        abc.Example m;
        Assert.That(false);
        yield return null;
    }
}

Mon exemple.cs

namespace abc
{
    public class Example
    {


    }
}
24
HAL9000

Essayez d’utiliser l’interface utilisateur de Test Runner intégrée pour configurer votre dossier Test Assembly et votre premier script de test.

Utilisation Window -> Test Runner -> EditMode -> "Create Test Assembly Folder" et une fois que vous avez accédé au nouveau dossier Test Assembly, utilisez la commande Create Test Script in current folder bouton.

En particulier, votre Tests.asmdef Il manque une inclusion "Editor" par rapport à la configuration par défaut (dans Unity 2018.1).

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ]
}

Vous ne devez rien faire manuellement dans le projet Visual Studio dans le but de configurer vos tests.

Notez que lorsque mon fichier d'assemblage est défini sur "Toutes les plates-formes" comme suit (comme dans votre question):

{
    "name": "Tests",
    "optionalUnityReferences": [
        "TestAssemblies"
    ]
}

Mes tests n'apparaissent pas dans la fenêtre Test Runner.

Lorsque mon fichier d'assemblage est explicitement défini pour inclure uniquement la plate-forme "Editeur" (comme dans mon exemple précédent), mes tests s'affichent correctement dans la fenêtre Test Runner.

(Ce comportement me semble un peu contre-intuitif.)


Vous devez également configurer une définition d'assemblage pour vos scripts. Sous votre dossier Scripts, créez un fichier de définition d'assembly MyScriptAssembly.asmdef _ (en utilisant le menu Unity Assets -> Create -> Assembly Definition ou manuellement):

{
    "name": "MyScriptAssembly"
}

Ensuite, assurez-vous que votre Tests.asmdef référencez votre script Assembly:

{
    "name": "Tests",
    "references": [
        "MyScriptAssembly"
    ],
    "optionalUnityReferences": [
        "TestAssemblies"
    ],
    "includePlatforms": [
        "Editor"
    ],
    "excludePlatforms": [],
    "allowUnsafeCode": false
}

Vous pouvez également le configurer dans la fenêtre de l'inspecteur Unity Editor. Voir "Références" dans l'inspecteur lors de la sélection d'un fichier .asmdef:

Assembly definition inspector window

(Pour plus de détails, voir documentation de Unity sur les fichiers de définition d'Assembly) )

31
sonny

Enfin trouvé la bonne solution pour cela. Et tout se fait à travers l'éditeur.

Notre objectif est donc de faire en sorte que l’assemblée de test fasse référence à l’assemblée en code réel. Pour ce faire, vous devez définir les deux assemblys, puis définir la référence dans l'unité.

  1. Créez vos tests comme d'habitude depuis Unity. Avec la génération de l'Assemblée.
  2. Allez dans votre dossier de scripts (généralement Assets/Scripts) et faites un clic droit -> Créer une définition d'assemblage Cela créera également un fichier d'assemblage.
  3. Accédez à vos tests Info sur l’assemblage dans Unity et ajoutez une référence à votre real Assembly et assurez-vous que ce n'est marqué que pour la plate-forme Editor.

Vous êtes prêt Vos tests doivent être visibles et exécutables dans Unity, et ils peuvent référencer tout autre script.


N'oubliez pas que vous pouvez supprimer TOUS les fichiers .csproj et .sln du dossier racine et qu'Unity les recréera (ils ne doivent pas non plus être sur le contrôle de source).

Donc, votre test pour aller pour des changements comme ça devrait toujours être de

  1. Supprimez tout fichier associé à Visual Studio dans le dossier.
  2. Sélectionnez Actifs -> Ouvrir le projet C #. Laissez-le faire sa chose.
  3. Si tout est compilé, exécuté et que vos tests le sont également, vous avez bien configuré les choses.

Bonus: Nous avons également quelques projets de débogage dans notre projet situés dans Assets/DebugScenes/DebugScripts. En créant un assemblage séparé pour eux et en le faisant référencer le script réel Assembly (si nécessaire) et en le marquant comme éditeur, nous nous assurons que ces scripts ne sont jamais inclus dans notre construction sans aucune étape supplémentaire construire.


Lecture supplémentaire. Vous pensez peut-être que vous ne voulez pas créer d'assembly pour TOUS vos scripts car vous souhaitez seulement en tester quelques-uns. Et il est vrai que vous pouvez créer un assembly pour un sous-dossier, mais cela vous causera des problèmes car vous devrez alors créer une référence d'un assemblage de scripts réel à un autre. Alors assurez-vous que tout est bien rangé et a du sens ...


Our test and real script Assembly infos side-by-side. Game Title has Planetary in it

7
Thanasis Kapelonis