Partilhar via


Elaboração de Testes em C#

O exemplo abaixo mostra um arquivo de .cs C# com uma única classe de teste simples que demonstra a marcação de testes C#. (Observe que este exemplo é apenas para fins demonstrativos, portanto, não será compilado ou executado.)

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   }

Para declarar testes c#, o TAEF usa a marcação de teste VSTS.

Para declarar uma classe de teste em C#, use o atributo [TestClass] em uma classe C# comum (Linha 7) e, para uma declaração de método de teste, use o atributo [TestMethod] em um método de classe comum (Linha 51).

A marcação de testes em C# também suporta um conjunto completo de métodos de configuração e limpeza.

O método estático com o conjunto de atributos [AssemblyInitialize] é executado antes de qualquer outro método de classe e executa a inicialização no nível de montagem (Linha 10). Consequentemente, há um método de limpeza de assembly, um método estático com o atributo [AssemblyCleanup] definido, que se executa após todos os outros métodos serem concluídos (Linha 18).

Da mesma forma, existem métodos de configuração e limpeza para classes e testes. (ver linhas 24, 32, 38, 44) Ao contrário do C++, os métodos de configuração e limpeza de classes no código gerenciado devem ser estáticos.

A marcação de teste TAEF C# suporta propriedades de teste, classe e módulo.

Para definir as propriedades do módulo, defina atributos em um inicializador de assembly (consulte as linhas 11 e 12). Da mesma forma, para definir propriedades de nível de classe, defina propriedades em um inicializador de classe (consulte as linhas 25 e 26). Para uma propriedade de nível de método de teste, basta aplicar a propriedade a um método de teste específico. (ver linhas 52 e 53)

Em execução no VSTS

Nota: para reduzir a dependência de binários VSTS, atualmente os métodos de configuração Class e Assembly usam Object como um primeiro parâmetro.

Se você quiser executar os testes do VSTS, altere esse tipo de objeto para o tipo TestContext . Tenha em mente que isso adicionará uma dependência de microsoft.visualstudio.qualitytools.unittestframework.dll e microsoft.visualstudio.qualitytools.resource.dll.

As etapas são um pouco diferentes quando executadas no VSTS. Você precisa configurar suas configurações de Execução de Teste Local para copiar suas dependências não gerenciadas. Para fazer isso, vá para:

  • Test-Editar> Configurações de Execução de Teste-Local> Execução de Teste
  • Clique em Deployment.Insira as dlls que você precisa copiar para cada teste:
    • Wex.Logger.dll
    • Wex.Common.dll
    • Wex.Common.Managed.dll
    • Wex.Communication.dll
    • Wex.Logger.Interop.dll

Isso é necessário devido ao fato de que o VSTS faz um novo diretório e copia arquivos toda vez que executa seus casos de teste. Você pode ver esses diretórios em sua máquina como pasta irmã para sua pasta de projeto.

Executando testes gerenciados no domínio do aplicativo padrão

Por padrão, para isolamento de código de teste, o TAEF executa testes gerenciados em um domínio de aplicativo de teste especial. No entanto, ao usar domínios de aplicativo não padrão, cenários em que o código nativo chama para código gerenciado (por exemplo, funções de retorno de chamada nativas consumidas pelo código gerenciado) podem causar erros com a mensagem: "Não é possível passar um GCHandle entre AppDomains". Para esses cenários, force a execução de testes gerenciados no domínio do aplicativo padrão usando a opção /defaultAppDomain .

Observe que a execução de testes gerenciados no domínio do aplicativo padrão é incompatível com os arquivos de configuração do assembly.

Suporte para métodos de teste assíncronos

Os binários NetFX 4.5 da TAEF suportam a execução de métodos de teste TAEF assíncronos. Isso significa que os testes TAEF marcados com a palavra-chave async podem aguardar operações assíncronas.

Observação Não tente aproveitar esta funcionalidade com os binários NetFX 2.0/3.5 da TAEF; apenas os binários do NetFX 4.5 suportam esse recurso.

O TAEF suporta os métodos de teste async void e async Task (ambos resultarão na mesma funcionalidade):

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

Como alternativa:

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