Condividi tramite


Più origini dati

Più origini dati sono utili quando si sta cercando un'espansione combinatoriale di una o più origini dati (Origine dati basata su tabelle, origine dati basata su PICT o datasource basata su WMI).

La creazione del progetto di test per un uso efficiente di questa funzionalità è fondamentale. Vediamo con l'aiuto di un esempio perché questo è così. Si supponga di far parte di più origini dati, si desidera specificare due origini dati basate su tabelle, una datasource basata su WMI e un'origine dati basata su PICT. Per motivi di argomento, si supponga che la prima tabella abbia 4 righe, la seconda contiene 5 righe, la query WMI restituisce 2 risultati e le combinazioni di 6 combinazioni pairwise generate da PICT DataSource. Il TAEF verrà creato con un'espansione combinatoria di questi set di parametri. Ciò significa che il metodo di test in questione verrà richiamato (4 X 5 X 2 X 6 =) 240 volte! L'aumento del numero di chiamate del metodo di test con combinazioni variabili di parametri può produrre risultati in diminuzione per quanto riguarda la copertura dei test. Ciò rende importante progettare il test usando più origini dati con attenzione e valutando altre alternative. Di seguito sono riportati alcuni punti da considerare:

  • Assicurarsi di aggiungere un valore per avere più tabelle. Se non è necessario separarli, è possibile creare una combinazione efficiente di parametri manualmente.
  • Controllare se è possibile usare un file di modello PICT con vincoli anziché più tabelle.
  • Controllare se il refactoring del test case è presente in più test e associare subset da più origini dati a ogni sottotesto appena creato.

Specificare più origini dati

L'aspetto chiave è come specificare l'origine dati. Esaminiamo ora il frammento di codice degli esempi nativi e gestiti.

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 */

Vedere le righe 11, 15 e 16 nell'esempio precedente. In generale, il modello da seguire per specificare DataSource è un elenco delimitato da punti e virgola di ogni specifica DataSource. La specifica sarà molto simile anche nel codice gestito.

Gestito

[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);
}

Gli esempi illustrano anche i modi per specificare più origini dati in più righe. Naturalmente, è possibile specificare DataSource in una singola riga (come illustrato di seguito), ma è possibile migliorare significativamente la leggibilità usando i costrutti illustrati sopra.

Specifica di DataSource in una singola riga

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

Solo per eseguire nuovamente l'iterazione: il metodo di test verrà eseguito una volta per ogni espansione combinatoriale n-way dei set di dati generati da ogni singola origine dati. Ad esempio, per l'esempio gestito precedente, presupponendo in modo sicuro che sia in esecuzione un solo servizio Temi e sapendo che nell'origine dati della tabella sono presenti 3 righe, il metodo di test verrà richiamato 3 volte (1 X 3). Nel caso di esempio nativo, nel metodo di test SecondTable, sono specificate due tabelle DataSources. La prima tabella contiene 3 righe e la seconda tabella contiene 4 righe. Di conseguenza, il metodo di test verrà richiamato 12 volte (3 X 4).

Vincoli che si applicano durante la specifica di più origini dati

I vincoli sono applicabili solo quando si vuole specificare un'origine dati basata su tabella nelle specifiche datasource multiple. Table DataSource deve essere specificato come Table:relative path to XML file#TableId.TableSource must be specified as Table:<relative path to XML file>#<TableId>. Se TAEF rileva che "TableId" viene fornito come metadati separati, si presuppone che DataSource sia un'unica origine dati basata su tabella e procedere.