Compartilhar via


Várias Fontes de Dados

Várias Fontes de Dados são úteis quando você está procurando uma expansão combinatória de uma ou mais Fontes de Dados (Fonte de Dados baseada em tabela, Fonte de Dados baseada em PICT ou Fonte de Dados baseada em WMI).

Criar seu design de teste para fazer uso eficiente desse recurso é fundamental. Vamos ver com a ajuda de um exemplo por que isso é assim. Digamos que, como parte de vários DataSource, você deseja especificar dois DataSources baseados em Tabela, um DataSource baseado em WMI e um DataSource baseado em PICT. Para fins de argumento, digamos que a primeira tabela tem 4 linhas, a segunda tem 5 linhas, a consulta WMI retorna 2 resultados e o PICT DataSource gerou seis combinações paritárias. O TAEF criará uma expansão combinatorial desses conjuntos de parâmetros. Isso significa que o método de teste em questão será invocado (4 X 5 X 2 X 6 =) 240 vezes! Aumentar o número de invocações do método de teste com combinações variadas de parâmetros pode produzir resultados decrescentes no que diz respeito à cobertura do teste. Isso torna importante projetar o teste com cuidado, utilizando várias fontes de dados e avaliando outras alternativas. A seguir estão alguns pontos que talvez você queira considerar:

  • Verifique se ele adiciona valor para ter várias tabelas. Se você não precisar que eles sejam separados, você pode criar uma combinação eficiente de parâmetros por conta própria.
  • Verifique se você pode usar um arquivo de modelo PICT com restrições, em vez de várias tabelas.
  • Verifique se há valor em refatorar seu caso de teste em múltiplos testes e associar subconjuntos dos múltiplos DataSources a cada subteste recém-criado.

Especificar vários DataSources

O aspecto principal aqui é como especificar o DataSource. Vamos dar uma olhada no trecho de código de nossos exemplos nativos e gerenciados.

Nativo

1   namespace WEX { namespace TestExecution { namespace Examples
2   {
3       class AdvancedDataDrivenTests
4       {
5           TEST_METHOD_SETUP(DataDrivenSetup);
6           TEST_METHOD_CLEANUP(DataDrivenCleanup);
7
8           TEST_CLASS(AdvancedDataDrivenTests)
9
10          BEGIN_TEST_METHOD(SecondTable)
11              TEST_METHOD_PROPERTY(L"DataSource", L"Table:AdvancedDataDrivenTests.xml#Table2;Table:CppTestLevelDataSource.xml#NestedTable")
12          END_TEST_METHOD()
13
14          BEGIN_TEST_METHOD(FirstTable)
15              TEST_METHOD_PROPERTY(L"DataSource", L"Table:AdvancedDataDrivenTests.xml#Table1;"
16                  L"PICT:PictDataSource.txt;" L"WMI:SELECT Location FROM Win32_StartupCommand")
17          END_TEST_METHOD()
18      };
19  } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

Veja as linhas 11, 15 e 16 no exemplo acima. Em geral, o padrão a seguir para especificar o DataSource é uma lista separada por ponto e vírgula de cada especificação do DataSource. A especificação também seria muito semelhante no código gerenciado.

Gerenciado

[TestMethod]
[DataSource(@"Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;
    WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]

public void First()
{
    Log.Comment("In CSharpAdvancedDataDrivenTests.First");
    String[] shapes = m_testContext.DataRow["Shape"] as String[];
    foreach (String shape in shapes)
    {
        Console.WriteLine("The shape is " + shape);
    }

    Int32[] lengths = m_testContext.DataRow["Length"] as Int32[];
    foreach (int length in lengths)
    {
        Console.WriteLine("The length is " + length.ToString());
    }

    String description = (String)m_testContext.DataRow["Description"];
    Boolean desktopInteract = (Boolean)m_testContext.DataRow["DesktopInteract"];
    UInt32 processId = (UInt32)m_testContext.DataRow["ProcessId"];
    Log.Comment("Themes service is running on process " + processId.ToString());
    Log.Comment("Themes service description: " + description);
}

Os exemplos também demonstram as maneiras de especificar vários DataSources em várias linhas. É claro que você poderia ter especificado o DataSource em uma única linha (conforme mostrado abaixo), mas poderia melhorar significativamente a legibilidade usando os constructos mostrados acima.

Especificando o DataSource em uma única linha

[DataSource("Table:CSharpAdvancedDataDrivenTests.xml#FirstTable;WMI:SELECT ProcessId FROM Win32_Service WHERE Name='Themes'")]

Apenas para iterar novamente: o método de teste será executado uma vez para cada expansão combinatorial n-way de conjuntos de dados gerados por cada DataSource individual. Por exemplo, para o exemplo gerenciado acima, supondo com segurança que há apenas um serviço temas em execução e sabendo que há três linhas na fonte de dados da tabela fornecida, o método de teste será invocado 3 vezes (1 X 3). No caso de exemplo nativo, no método de teste SecondTable, há duas fontes de dados de tabela especificadas. A primeira tabela contém 3 Linhas e a segunda tabela contém 4 linhas. Portanto, o método de teste será invocado 12 vezes (3 X 4).

Restrições que se aplicam ao especificar várias fontes de dados

As restrições são aplicáveis somente quando você deseja especificar um DataSource baseado em Tabela nas várias especificações do DataSource. Table DataSource deve ser especificado como Table:<relative path to XML file>#<TableId>. Se o TAEF descobrir que "TableId" é fornecido como metadado separado, ele assumirá que a fonte de dados é uma única fonte de dados baseada em tabela e continuará.