Тестирование на основе данных на основе легких весов
Скорее всего, существуют сценарии, в которых полное тестирование на основе xml DataSource и таблиц на основе данных может оказаться слишком тяжелым для вашего тестового сценария. Тестирование на основе данных на основе легких данных позволяет быстро и легко получить поддержку тестирования на основе данных, когда данные для теста просты и могут быть легко выражены в виде метаданных. Давайте рассмотрим пример и посмотрим, как.
Данные для теста на основе данных на основе легких весов выражаются как набор метаданных (на уровне теста, класса или модуля). Для каждого значения в этом наборе методы тестирования, связанные с настройкой и слезоточивыми методами, будут выполняться для каждого значения в наборе. Давайте рассмотрим, как создать этот код в машинном коде:
1 #include "WexString.h"
2 #include "WexTestClass.h"
3
4 using namespace WEX::Common;
5 using namespace WEX::TestExecution;
6 using namespace WEX::Logging;
7 namespace WEX { namespace TestExecution { namespace Examples
8 {
9 class SimpleDataDrivenExample
10 {
11 TEST_CLASS(SimpleDataDrivenExample);
12 ...
13 BEGIN_TEST_METHOD(SetsOfDataTest)
14 TEST_METHOD_PROPERTY(L"Data:Color", L"{Purple, Maroon, Brown}")
15 END_TEST_METHOD()
16 };
Обратите внимание на значения параметров для TEST_METHOD_PROPERTY в строке 14. Значение метаданных теста начинается с "{" и заканчивается символом "}", указывающим, что указан разделенный запятыми или точкой с запятой список значений. TAEF повторно выполнит метод теста в проблеме, SetOfDataTest() один раз для каждого значения в этом наборе.
Обратите внимание, что имя метаданных начинается с "Data:". Это означает, что набор метаданных действительно задает варианты для параметров теста на основе данных и будет доступен фактическому методу теста, подобно параметрам данных на основе таблицы, например:
11 ...
12
13 void SimpleDataDrivenExample::SetsOfDataTest()
14 {
15 String color;
16 if (SUCCEEDED(TestData::TryGetValue(L"color", color)))
17 {
18 Log::Comment(L"Color retrieved was " + color);
19 }
20 }
21 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */
При работе с управляемым кодом спецификация и извлечение набора данных очень похожа на собственный пример. Например:
1 namespace WEX.Examples
2 {
3 using Microsoft.VisualStudio.TestTools.UnitTesting;
4 using System;
5 using System.Collections;
6 using System.Data;
7 using WEX.Logging.Interop;
8 using WEX.TestExecution;
9
10 [TestClass]
11 public class CSharpDataDrivenSimpleExample
12 {
13 ...
14 [TestMethod]
15 [TestProperty("Data:Color", "{Red, Green, Blue}")]
16 public void SetsOfMetadataTest()
17 {
18 Log.Comment("Color is " + m_testContext.DataRow["Color"]);
19 }
20
21 public TestContext TestContext
22 {
23 get { return m_testContext; }
24 set { m_testContext = value; }
25 }
26
27 private TestContext m_testContext;
28 }
29 }
Как и в случае с тестами на основе таблиц, наборы данных, указанные в качестве метаданных, позволят получить данные через TestContext.DataRow.Обратите внимание, что для хранения легкого веса на основе данных тип параметра всегда будет WEX::Common::String (в машинном коде) и String(в управляемом коде)
Если задано несколько значений данных, будет получен декартовый продукт всех возможных значений, и метод теста будет вызван для каждой комбинации.
Кроме того, можно использовать некоторые наборы метаданных (например , наборы метаданных ThreadingModel), а также наборы данных, указанные для того же метода теста. В таком случае комбинаторное расширение всех наборов метаданных и наборов данных будет производиться TAEF, а методы тестирования, вызывающие озабоченность, будут вызываться с каждой комбинацией.
Особые случаи — тест на основе данных с наборами метаданных или данных
Вы можете использовать метод тестирования, зависящий от теста на основе таблиц, а также указать наборы данных или метаданных для него. Например, метод теста может иметь параметры "size" и "color", указанные в тесте на основе таблиц, и хотите, чтобы все строки выполнялись один раз с параметром прозрачности, равным true, а затем присвоено значение false. В таком случае "прозрачность" может быть указана как набор "{true, false}" для теста на основе данных. Важно отметить, что в случае конфликтов параметров в наборе метаданных заданы строки на основе таблиц, тип и значение уровня строки переопределит значение набора метаданных.
Выполнение тестов с помощью наборов данных или метаданных
Выполнение тестов, содержащих наборы данных, является довольно интуитивно понятным. Рассмотрим выходные данные /listproperties для наших примеров тестов:
1 te Examples\CPP.DataDriven.Example.dll /name:*SetsOfDataTest* /listproperties
2
3 Test Authoring and Execution Framework v2.9.3k for x64
4
5 f:\ Examples\CPP.SimpleDataDriven.Example.dll
6 WEX::TestExecution::Examples::SimpleDataDrivenExample<
7 WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet0
8 Property[Data:Color] = {Purple, Maroon, Brown}
9
10 Data[Color] = Purple
11
12 WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet1
13 Property[Data:Color] = {Purple, Maroon, Brown}
14
15 Data[Color] = Maroon
16
17 WEX::TestExecution::Examples::SimpleDataDrivenExample::SetsOfDataTest#metadataSet2
18 Property[Data:Color] = {Purple, Maroon, Brown}
19
20 Data[Color] = Brown
Обратите внимание на строки 7, 12 и 17 в приведенном выше примере. Индекс набора метаданных добавляется к каждому вызову метода теста со значением в наборе данных. Этот индекс имеет форму:
<namespace qualified test method name>#metadataSet<metadataIndex>
Строки 8, 13 и 18 показывают набор метаданных, указанный для этой поддержки тестирования на основе легких данных. В этом случае набор состоит из цветов фиолетового, maroon и коричневого. Строки 10, 15 и 20 показывают фактическое значение из этого набора, активное для текущего вызова теста. В случае SetOfMetadataTest#metadataSet1 второй вызов этого метода, активное значение параметра из набора — Maroon.
Вы можете выбрать значение или имя данных так же, как и в тестах на основе таблиц. Например, можно выбрать SetOfDataTest#metadataSet1, например /select:'Maroon' или /name:@Data:Color=*#metadataSet1
Чтобы получить краткий справочник, выходные данные /listproperties из примера неуместного теста показаны ниже.
te Examples\CSharp.DataDriven.Example.dll /name:*SetsOfMetadataTest* /listproperties
Test Authoring and Execution Framework v2.9.3k for x64
f:\ Examples\CSharp.DataDrivenSimple.Example.dll
WEX.Examples.CSharpDataDrivenSimpleExample
WEX.Examples.CSharpDataDrivenSimpleExample.NonDataDrivenTest
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet0
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Red
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet1
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Green
WEX.Examples.CSharpDataDrivenSimpleExample.SetsOfMetadataTest#metadataSet2
Property[Data:Color] = {Red, Green, Blue}
Data[Color] = Blue