Condividi tramite


Creazione di test in C#

L'esempio seguente mostra un file di .cs C# con una semplice classe di test singola che illustra il markup dei test C#. Si noti che questo esempio è solo a scopo dimostrativo, quindi non verrà compilato o eseguito.

1    using Microsoft.VisualStudio.TestTools.UnitTesting;
2    using System;
3    using System.Collections;
4    using WEX.Logging.Interop;
5    using WEX.TestExecution;
6
7    [TestClass]
8    public class ManagedStartMenuTests
9    {
10       [AssemblyInitialize]
11       [TestProperty("Component", "Navigation")]
12       [TestProperty("SubComponent", "StartMenu")]
13       public static void RunModuleSetup(Object context)
14       {
15           defaultPolicy = SetObjectFactoryPolicy(PolicyClassic);
16       }
17
18       [AssemblyCleanup]
19       public static void RunModuleCleanup()
20       {
21           SetObjectFactoryPolicy(defaultPolicy);
22       }
23
24       [ClassInitialize]
25       [TestProperty("TeamOwner", "WEX")]
26       [TestProperty("GroupOwner", "MediaPlayerTest")]
27       public static void TestClassSetup(Object testContext)
28       {
29           objectFactory = new ObjectFactory();
30       }
31
32       [ClassCleanup]
33       public static void TestClassCleanup()
34       {
35           objectFactory.Dispose();
36       }
37
38       [TestInitialize]
39       public void TestMethodSetup()
40       {
41           startMenuObject = objectFactory.CreateObject();
42       }
43
44       [TestCleanup]
45       public void TestMethodCleanup()
46       {
47           startMenuObject.Dispose();
48       }
49
50
51       [TestMethod]
52       [Owner("Someone")]
53       [Priority(0)]
54       public void TestMethod1()
55       {
56           Verify.AreEqual(startMenuObject.size, expectedObjectSize);
57       }
58   }

Per dichiarare i test c#, TAEF usa il markup di test VSTS.

Per dichiarare una classe di test in C#, usare l'attributo [TestClass] in una classe C# normale (Riga 7) e per una dichiarazione di metodo di test, usare l'attributo [TestMethod] su un metodo di classe ordinario (Riga 51).

Il markup di test C# supporta anche un'ampia gamma di metodi di installazione e pulizia.

Il metodo statico con il set di attributi [AssemblyInitialize] viene eseguito prima di qualsiasi altro metodo di classe ed esegue l'inizializzazione a livello di assembly (riga 10). Di conseguenza, esiste un metodo di pulizia dell'assembly, un metodo statico con il set di attributi [AssemblyCleanup] eseguito dopo il completamento di tutti gli altri metodi (Riga 18).

Analogamente, esistono metodi di installazione e pulizia di classi e test. (vedere le righe 24, 32, 38, 44) A differenza di C++, i metodi di installazione e pulizia della classe nel codice gestito devono essere statici.

Il markup di test C# di TAEF supporta proprietà di test, classi e moduli.

Per impostare le proprietà del modulo, impostare gli attributi su un inizializzatore di assembly (vedere le righe 11 e 12). Analogamente, per impostare le proprietà a livello di classe, impostare le proprietà su un inizializzatore di classe (vedere le righe 25 e 26). Per una proprietà del livello del metodo di test, è sufficiente applicare la proprietà a un metodo di test specifico. (vedere le righe 52 e 53)

Esecuzione in VSTS

Nota: per ridurre la dipendenza dai file binari VSTS, attualmente i metodi di installazione di classe e assembly accettano Object come primo parametro.

Per eseguire i test da VSTS, modificare il tipo di oggetto in Tipo TestContext . Tenere presente che verrà aggiunta una dipendenza da microsoft.visualstudio.qualitytools.unittestframework.dll e microsoft.visualstudio.qualitytools.resource.dll.

I passaggi sono leggermente diversi durante l'esecuzione in VSTS. È necessario configurare le impostazioni di esecuzione del test locale per copiare le dipendenze non gestite. A tale scopo, passare a:

  • Test-Edit> Test Run Configurations-Local> Test Run
  • Fare clic su Deployment.Enter the dlls that you need copied over for each test:
    • Wex.Logger.dll
    • Wex.Common.dll
    • Wex.Common.Managed.dll
    • Wex.Communication.dll
    • Wex.Logger.Interop.dll

Ciò è necessario a causa del fatto che VSTS crea una nuova directory e copia i file ogni volta che esegue i test case. È possibile visualizzare queste directory nel computer come cartella di pari livello nella cartella del progetto.

Esecuzione di test gestiti nel dominio applicazione predefinito

Per impostazione predefinita, per l'isolamento del codice di test, TAEF esegue test gestiti in un dominio applicazione di test speciale. Tuttavia, quando si usano domini applicazione non predefiniti, gli scenari in cui il codice nativo chiama nel codice gestito (ad esempio, le funzioni di callback native utilizzate dal codice gestito) possono causare errori con il messaggio "Cannot pass a GCHandle across AppDomains". Per questi scenari, forzare l'esecuzione dei test gestiti nel dominio applicazione predefinito usando l'opzione /defaultAppDomain .

Si noti che l'esecuzione di test gestiti nel dominio applicazione predefinito non è compatibile con i file di configurazione dell'assembly.

Supporto per i metodi di test asincroni

I file binari NetFX 4.5 di TAEF supportano l'esecuzione di metodi di test TAEF asincroni. Ciò significa che i test TAEF contrassegnati con la parola chiave asincrona sono in grado di attendere le operazioni asincrone.

Nota Non tentare di sfruttare questa funzionalità con i file binari NetFX 2.0/3.5 di TAEF. Solo i file binari NetFX 4.5 supportano questa funzionalità.

TAEF supporta sia i metodi di test asincroni void che async Task (entrambi generano la stessa funzionalità):

[TestMethod]
public async Task MyAsyncTest()
{
    await AsyncAPICall1();
    var result = await AsyncAPICall2();
    Verify.IsTrue(result);
}

In alternativa:

[TestMethod]
public async void MyAsyncTest2()
{
    await AsyncAPICall1();
    var result = await AsyncAPICall2();
    Verify.IsTrue(result);
}