Compartilhar via


Várias fontes de dados

Vários DataSources são úteis quando você está procurando uma expansão combinatória de um ou mais DataSources (DataSource baseado em tabela, DataSource baseado em PICT ou DataSource baseado em WMI).

Elaborar seu design de teste para fazer uso eficiente desse recurso é fundamental. Vejamos, com a ajuda de um exemplo, por que isso acontece. Digamos que, como parte de vários DataSource, você queira especificar dois DataSources baseados em tabela, um DataSource baseado em WMI e um DataSource baseado em PICT. Por uma questão de argumento, digamos que a primeira tabela tenha 4 linhas, a segunda tenha 5 linhas, a consulta WMI retorna 2 resultados e o PICT DataSource gerou 6 combinações pareadas. O TAEF apresentará uma expansão combinatória 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! O aumento do número de invocações do método de ensaio com combinações variáveis de parâmetros pode produzir resultados decrescentes no que diz respeito à cobertura do ensaio. Isso torna importante projetar o teste usando vários DataSources com cuidado e ponderando outras alternativas. A seguir estão alguns pontos que você pode querer considerar:

  • Certifique-se de que agrega valor ter várias tabelas. Se você não precisa que eles sejam separados, você mesmo pode criar uma combinação eficiente de parâmetros.
  • 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 vários testes e associar subconjuntos de vários DataSources a cada subteste recém-criado.

Especificar várias fontes de dados

O aspecto chave 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 ser seguido para especificar o DataSource é uma lista separada por ponto-e-vírgula de cada especificação DataSource. A especificação seria muito semelhante no código gerenciado também.

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, você poderia ter especificado o DataSource em uma única linha (como mostrado abaixo), mas você poderia melhorar a legibilidade significativamente usando as construções mostradas acima.

Especificando DataSource em uma única linha

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

Apenas para repetir: o método de teste será executado uma vez para cada expansão combinatória 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 Themes em execução e sabendo que há 3 linhas na fonte de dados da tabela fornecida, o método de teste será chamado 3 vezes (1 X 3). No caso de exemplo nativo, no método de teste SecondTable, há duas tabelas DataSources especificadas. A primeira tabela contém 3 linhas e a segunda tabela contém 4 linhas. Assim, o método de teste será invocado 12 vezes (3 X 4).

Restrições que se aplicam ao especificar Multiple DataSources

As restrições são aplicáveis somente quando você deseja especificar uma fonte de dados baseada em tabela nas várias especificações de fonte de dados. A fonte de dados da tabela deve ser especificada como Tabela:<caminho relativo para o arquivo> XML#<TableId>. Se o TAEF descobrir que "TableId" é fornecido como um metadados separado, ele assumirá que o DataSource é um único DataSource baseado em tabela e continuará.