Aracılığıyla paylaş


Tablo Veri Kaynağı

Bu bölüme geçmeden önce lütfen TAEF'in temel yürütmesini bildiğinizden ve testleri kullanarak nasıl Yazabileceğinizi bildiğinizden emin olun.

Artık TAEF ile yazılmış ve üzerinde çalıştığınız temel test otomasyonuna sahip olduğunuz için, aynı test kodunun farklı veri kümeleri üzerinde çalışmak için kullanabildiği senaryolara odaklanabilirsiniz. Bu amaçla, TAEF veri temelli testlere "Tablo tabanlı" bir yaklaşım sağlar. Şimdi veri temelli test yazma hakkında bilgi edinmek için basit bir örneğe göz atalım.

Boyutu ve temayı konsola yazdırdığınız veri temelli olmayan basit bir örneği düşünün. Bu alıştırmada bu testi veri temelli teste dönüştüreceksiniz.

1  namespace WEX { namespace TestExecution { namespace Examples
2  {
3     void DataDrivenTests::FirstTable()
4     {
5         int size = 12;
6         Log::Comment(String().Format(L"Size retrieved was %d", size));
7     }
8
9     void DataDrivenTests::SecondTable()
10    {
11        String theme = "Aero";
12        Log::Comment(L"Theme supplied as " + theme);
13    }
14 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

Verileri Tanımlama

Şimdi yukarıdaki işlevin bir dizi boyut ve tema için çalışmasını istiyorsunuz. Başka bir deyişle işlevimizin kullanabileceği değişken veri değerlerini istiyorsunuz. Bunu yapmak için DataDrivenTests.xml bir XML dosyasında iki tablo tanımlayın:

1  <?xml version="1.0"?>
2  <Data>
3  <Table Id ="Table1">
4          <ParameterTypes>
5                  <ParameterType Name="Size">Int32</ParameterType>
6                  <ParameterType Name="Color">String</ParameterType>
7                  <ParameterType Name="Transparency">Boolean</ParameterType>
8          </ParameterTypes>
9          <Row Priority="1" Owner="C2">
10                 <Parameter Name="Size">12</Parameter>
11                 <Parameter Name="Color">Blue</Parameter>
12                 <Parameter Name="Transparency">True</Parameter>
13         </Row>
14         <Row Priority="2" Owner="wex">
15                 <Parameter Name="Size">4</Parameter>
16                 <Parameter Name="Color">White</Parameter>
17                 <Parameter Name="Transparency">False</Parameter>
18         </Row>
19         <Row Owner="C2">
20                 <Parameter Name="Size">9</Parameter>
21                 <Parameter Name="Color">Black</Parameter>
22                 <Parameter Name="Transparency">True</Parameter>
23         </Row>
24 </Table>
25 <Table id ="Table2">
26         <Row Description="ButtonTest" Owner="C2" Priority="1">
27                 <Parameter Name="Control">Button</Parameter>
28                 <Parameter Name="Theme">Aero</Parameter>
29         </Row>
30         <Row Description="ComboBoxTest" Priority="2">
31                 <Parameter Name="Control">ComboBox</Parameter>
32                 <Parameter Name="Theme">Classic</Parameter>
33         </Row>
34         <Row Description="ListviewTest" Owner="wex">
35                 <Parameter Name="Control">Listview</Parameter>
36                 <Parameter Name="Theme">AeroBasic</Parameter>
37         </Row>
38 </Table>
39 </Data>

Şimdi "Tablo1" ve "Tablo2" olmak üzere iki tablo tanımlamış oldunuz. Aynı XML dosyasındaki çeşitli test yöntemleri için tablolar tanımlayabilirsiniz.

Tablo1'de ParameterTypes'ı önden tanımladığınıza ve "Boyut" öğesini tamsayı olarak seçtiğinize dikkat edin. ParameterTypes bölümü isteğe bağlıdır. Varsayılan olarak, parametre türü bilgileri sağlanmazsa, dize olarak kaydedilir. "Tablo2" içindeki tüm parametreler için bu durum söz konusudur.

Bir tablo içinde tanımlanan her "Satır", test işlevinin kabul etmelerini istediğiniz bir veri (parametre) değerleri kümesidir. Satır 9, 14 ve 19, FirstTable işlevimizin kabul edeceğini 3 veri kümesi tanımlar. Benzer şekilde, 26, 30 ve 34 satırları SecondTable için veri kümelerini tanımlar.

Yukarıdaki örnekteki 9, 14, 19, 26, 30 ve 34. satırlara dikkat edin. Satıra özgü meta veriler tanımlayabilirsiniz. Artık meta veri bilgilerinin aynı işlev için veri kümeleriyle değiştirilmesinin bir yolu vardır. İlk veri kümesinin önceliği (satır 9) 1' dir, ikinci veri kümesinin önceliği (14. satır) 2'dir ve üçüncü veri kümesi (satır 19) işlevin önceliğini varsayılan olarak belirler. Tüm satırlar, tablonun ilişkili olduğu işlevden meta verileri devralır. Aynı meta veriler satır düzeyinde yeniden belirtilirse, işlev düzeyinde tanımlanan meta veri değerlerini geçersiz kılar.

NOT: XML dosya şeması tanımı, desteklenen tür tanımları dışında yerel ve yönetilen kod için aynıdır. Verilerin nasıl tanımlanacağına ilişkin başka bir örnek için aşağıdaki "Yönetilen Veri Temelli Test" bölümünün ilk bölümüne bakın. Yerel kodda izin verilen türleri anlamak için Yerel Veri Temelli Test ile devam edin.

Yerel Veri temelli test

Tanımlanan ve kullanıma hazır veri kümeleriyle, artık test işlevini veri temelli test olarak nitelemenin ve veri kümesini tanımlayan tabloyla ilişkilendirmenin bir yoluna ihtiyacınız vardır. Bu, testi yazarken ek meta veriler yoluyla yapılır:

1  namespace WEX { namespace TestExecution { namespace Examples
2  {
3      class DataDrivenTests
4      {
5          TEST_CLASS(DataDrivenTests);
6
7          BEGIN_TEST_METHOD(SecondTable)
8              TEST_METHOD_PROPERTY(L"DataSource", L"Table:DataDrivenTests.xml#Table2")
9              TEST_METHOD_PROPERTY(L"Priority", L"3")
10         END_TEST_METHOD()
11
12         BEGIN_TEST_METHOD(FirstTable)
13             TEST_METHOD_PROPERTY(L"Priority", L"4")
14             TEST_METHOD_PROPERTY(L"DataSource", L"Table:DataDrivenTests.xml#Table1")
15         END_TEST_METHOD()
16     };
17 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

XML Tablosunu testle ilişkilendirmek için testin yöntemine 'DataSource' meta verilerini ekleyin. Bu ilişkilendirme aracılığıyla TAEF, testi yönlendirmek için verilen DataSource'ı kullanır. DataSource değerinin üç bölümü vardır:

  1. 'Tablo:' - Bu, veri kaynağını bir XML tablosu olarak tanımlar.
  2. 'DataDrivenTests.xml' - Bu, XML tablosunu içeren dosyadır.
  3. '#Table2' - '#' sınırlayıcısını takip eden 'Table2' değeri, kullanılacak XML belgesi içindeki belirli tabloyu tanımlar. Tek bir XML Tablosu veri kaynağı birden çok tablo içerebilir. TAEF, belirtilen değerle eşleşen 'Id' özniteliğine sahip bir Tablo öğesinin XML dosyasına bakar.

Yukarıdaki örnekte "SecondTable"ın "FirstTable" öncesinde tanımlandığını gözlemlemiş olabilirsiniz. Bu, "SecondTable" işlevinin "FirstTable" işlevinden önce yürütüleceği anlamına gelir, ancak "FirstTable"a karşılık gelen "Tablo1" tablosunu", "SecondTable"a karşılık gelen "Tablo2" tablosundan önce tanımlamış olursunuz. Bu, veri temelli testlerin bulunması ve yürütülmesi sırasında tablo tanımının sırasının ilgisiz olduğunu vurgular.

Veri kaynağımızın test yöntemine eşlemesi tamamlandıktan sonra örneği değiştirerek kaynaktan veri alabilirsiniz. Bunu yapmadan önce, yayımlanan üst bilgi dosyası olan TestData.h'ye göz atın. İlgi çekici olan kısmı:

1    class TestData
2    {
3    public:
4        template <typename T>
5        static HRESULT __stdcall TryGetValue(_In_z_ const wchar_t* pszString, T& result)
6        {
7            return Private::TestData<T>::TryGetValue(pszString, result);
8        }
9    };

5. satır, işlevdeki verileri almak için çağrılacak API'yi gösterir. Alma için kullanılabilir Parametre Türleri'ne göz atın.

Tamam - örneğimizi yeniden yazmak için her şey ayarlandı:

1  namespace WEX { namespace TestExecution { namespace Examples
2  {
3      void DataDrivenTests::FirstTable()
4      {
5          Log::Comment(L"I am in first table");
6          int size;
7          if (SUCCEEDED(TestData::TryGetValue(L"size", size)))
8          {
9              VERIFY_ARE_NOT_EQUAL(size, 0);
10             Log::Comment(String().Format(L"Size retrieved was %d", size));
11         }
12     }
13
14     void DataDrivenTests::SecondTable()
15     {
16         Log::Comment(L"I am in second table.");
17         String theme;
18         if (SUCCEEDED(TestData::TryGetValue(L"theme", theme)))
19         {
20             Log::Comment(L"Theme supplied as " + theme);
21         }
22     }
23 } /* namespace Examples */ } /* namespace TestExecution */ } /* namespace WEX */

7. ve 18. satırlar, test verilerinin yönlendirilmesi için değiştirilen ana parçalardır. Büyük bir değişiklik değil. Veri temelli testleri yürütürken TAEF'in en iyi şekilde nasıl yararlanacaklarını anlamak için Veri Temelli Testleri Yürütme bölümüne göz atın.

Yönetilen Veri temelli test

Konsoldaki bir dikdörtgenin koordinatlarını yazdırmak istediğiniz bir örnek düşünün. Bu koordinatları bir XML dosyasında veri kümesi olarak tanımlayarak başlayın.

1  <?xml version="1.0"?>
2  <Data>
3  <Table Id="FirstTable">
4          <ParameterTypes>
5                  <ParameterType Name="Left">Int32</ParameterType>
6                  <ParameterType Name="Right">String</ParameterType>
7                  <ParameterType Name="Top">Integer</ParameterType>
8                  <ParameterType Name="Bottom">Int32</ParameterType>
9          </ParameterTypes>
10         <Row Priority="1" Owner="C2" Description="Zero rect">
11                 <Parameter Name="Left">0</Parameter>
12                 <Parameter Name="Right">0</Parameter>
13                 <Parameter Name="Top">0</Parameter>
14                 <Parameter Name="Bottom">0</Parameter>
15         </Row>
16         <Row Priority="2" Owner="wex" Description="normal rect">
17                 <Parameter Name="Left">12</Parameter>
18                 <Parameter Name="Right">25</Parameter>
19                 <Parameter Name="Top">10</Parameter>
20                 <Parameter Name="Bottom">50</Parameter>
21         </Row>
22         <Row Owner="C2" Description="invalid rect">
23                 <Parameter Name="Left">30</Parameter>
24                 <Parameter Name="Right">15</Parameter>
25                 <Parameter Name="Top">40</Parameter>
26                 <Parameter Name="Bottom">10</Parameter>
27         </Row>
28 </Table>
29 </Data>

Veri kümesini, yukarıdaki 3. satırda tanımlanan "FirstTable" adlı tablo kapsamında tanımlayın. Aynı XML dosyasındaki çeşitli test yöntemleri için tablolar tanımlayabilirsiniz.

FirstTable'ın ParameterTypes'ı önceden tanımladığını ve "Sol" öğesini "Int32" olarak çağırdığını gözlemleyin. ParameterTypes bölümü isteğe bağlıdır. Varsayılan olarak, parametre türü bilgileri sağlanmazsa Dize olarak kaydedilir.

Desteklenen Parametre Türleri listesine göz atın.

Başka bir veri türü belirtilirse, test bir uyarı oluşturur ve bunu bir Dize olarak değerlendirir.

NOT: Tür dizeleri büyük/küçük harfe duyarlı değildir, ancak tam olarak yukarıda gösterildiği gibi yazılmalıdır.

Bir tablo içinde tanımlanan her "Satır", test işlevinin kabul etmelerini istediğiniz bir veri (parametre) değerleri kümesidir. Satır 10, 16 ve 22 işlevimizin 3 veri kümesini tanımlar.

Yukarıdaki örnekte 10, 16 ve 22. satırlara dikkat edin. Satıra özgü meta veriler tanımlayabilirsiniz. Artık aynı işlevin veri kümeleriyle meta veri bilgilerinin değişmesi için bir yolunuz var. İlk veri kümesinin önceliği (10. satır), ikinci veri kümesinin önceliği (16. satır) 2 ve üçüncü veri kümesi (satır 22) işlevin önceliğini varsayılan olarak belirler. Tüm satırlar, tablonun ilişkili olduğu işlevden meta verileri devralır. Aynı meta veriler satır düzeyinde yeniden belirtilirse, işlev düzeyinde tanımlanan meta veri değerlerini geçersiz kılar.

NOT: XML dosya şeması tanımı, desteklenen tür tanımları dışında yerel ve yönetilen kod için aynıdır. Bunun nasıl tanımlanacağına ilişkin başka bir örnek için bu sayfanın üst kısmındaki "Verileri Tanımlama" bölümüne göz atın.

Artık tüm verileri tanımlamış olursunuz. Aşağıdaki örnek, nasıl eriş yapılacağını gösterir.

1  namespace WEX.Examples
2  {
3      using Microsoft.VisualStudio.TestTools.UnitTesting;
4      using System;
5      using System.Collections;
6      using WEX.Logging.Interop;
7      using WEX.TestExecution;
8
9      [TestClass]
10     public class CSharpDataDrivenTests
11     {
12         [TestMethod]
15         [DataSource("Table:CSharpDataDrivenTests.xml#FirstTable")]
16         public void First()
17         {
18             Console.WriteLine("Left is " + m_testContext.DataRow["Left"].ToString());
19
20             Log.Comment("In CSharpDataDrivenTests.First");
21         }
22
23         [TestMethod]
24         public void Second()
25         {
26             Log.Comment("In CSharpDataDrivenTests.Second");
27             Verify.IsTrue(true);
28         }
29
30         public TestContext TestContext
31         {
32             get { return m_testContext; }
33             set { m_testContext = value; }
34         }
35
36         private TestContext m_testContext;
37     }
38 }

XML Tablosunu yönetilen koddaki belirli bir test yöntemiyle ilişkilendirmek yerel koda çok benzer; yalnızca 'DataSource' meta verilerini uygulayın. Daha önce olduğu gibi üç bölümden oluşuyor:

  1. 'Table:' - veri kaynağını xml tablosu olarak tanımlamak için.
  2. 'CSharpDataDrivenTests.xml' - XML tablosunu içeren dosya.
  3. '#FirstTable' - '#' sınırlayıcısını izleyen 'FirstTable' değeri, kullanılacak XML belgesi içindeki belirli tabloyu tanımlar. TAEF, belirtilen değerle eşleşen 'Id' özniteliğine sahip bir Tablo öğesinin XML dosyasına bakar.

Second işlevinin veri temelli olmadığını fark edin. Yalnızca bazı testlerinizin veri temelli olmasını seçebilirsiniz. Ayrıca her testin kendi tablosunun farklı bir XML dosyasında tanımlanmasını da tercih edebilirsiniz.

36. Satırda, VSTS'nin TestContext Sınıfı'nı önermesi gibi özel bir TestContext özelliği tanımlarsınız. Ayrıca bu özelliğe kamusal değerlendirme yapanlar tanımlarsınız (satır 30'dan 34'e kadar). İçsel olarak TAEF, TestContext'in sözlük özelliğini odaktaki ilgili veri kümesiyle yükler.

TestContext, Microsoft.VisualStudio.TestTools.UnitTesting içinde tanımlanır. Yukarıdaki örnekteki 3. satıra bakın. Bunu zaten yönetilen test yazım sürecinize referans olarak dahil etmelisiniz. Bu nedenle, veri temelli testler yazmak için ek başvuru gerekmez.

Yukarıdaki örneğin 18. satırında işlevdeki verilerin nasıl alıneceğini gösterirsiniz. Verilerin m_testContext.DataRow'da kullanılabilir olduğuna dikkat edin.

Bir DataRow'u Tanımlamak için İndeks Yerine Ad Kullanma

TAEF, DataSource'unuzda herhangi bir DataRow'ı tanımlamak için Dizin yerine daha anlamlı bir 'Name' özelliğine sahip olmanıza olanak tanır. Bunu yapmak için DataSource'unuzda Satır düzeyinde 'Ad' meta verilerini eklemeniz yeterlidir. Bu sayfadaki ilk örneğimiz aşağıdaki gibi bu özelliği kullanacak şekilde değiştirilebilir:

1  <?xml version="1.0"?>
2  <Data>
3  <Table id ="Table1">
4          <ParameterTypes>
5                  <ParameterType Name="Size">Int32</ParameterType>
6                  <ParameterType Name="Color">String</ParameterType>
7                  <ParameterType Name="Transparency">Boolean</ParameterType>
8          </ParameterTypes>
9          <Row Name='BlueTransparent' Priority="1" Owner="C2">
10                 <Parameter Name="Size">12</Parameter>
11                 <Parameter Name="Color">Blue</Parameter>
12                 <Parameter Name="Transparency">True</Parameter>
13         </Row>
14         <Row Priority="2" Owner="wex">
15                 <Parameter Name="Size">4</Parameter>
16                 <Parameter Name="Color">White</Parameter>
17                 <Parameter Name="Transparency">False</Parameter>
18         </Row>
19         <Row Name='BlackTransparent' Owner="C2">
20                 <Parameter Name="Size">9</Parameter>
21                 <Parameter Name="Color">Black</Parameter>
22                 <Parameter Name="Transparency">True</Parameter>
23         </Row>
24 </Table>
25 ...
39 </Data>

Yukarıdaki değiştirilen örnekte ,'BlueTransparent', dizin 0'a karşılık gelir. Dizin 1'e sahip Satıra özel bir ad verilmemiştir ve dizin 2'ye sahip Satır 'BlackTransparent' Adı ile ilişkilendirilmiştir. 'Tablo1' içinde 0 veya 2 dizinini aramak için seçim sorgusunu kullanmaya devam edebilirsiniz ve doğru Satırı bulur. Ancak, dll dosyasını yürütürken veya listelerken şunları görmek yerine:

<qualified name of the test method>#<index>

bunun yerine şunu görürsünüz:

<qualified name of the test method>#<name property provided at Row level>

Satır düzeyinde "Name" özniteliğinin sağlandığı Satırlar için. Yukarıdaki dizin 1 gibi herhangi bir Satır için "Name" özelliği sağlanmazsa, varsayılan olarak yöntemin tam adında #<index> olur.

Satır düzeyinde bir "Ad" özniteliği sağlama yoluyla, TAEF'in yöntem çağrısı örneğinin adını karşılık gelen Satır verileriyle yorumlama biçimini temelde değiştirdiğinize dikkat edin.

Çalışma Zamanı parametresi olarak DataSource

TAEF, veri kaynağının çalışma zamanı parametresi olarak teminini destekler. Bunun söz dizimi aşağıdaki gibidir:

te <test dll names> /p:<DataSource runtime name>=Table:<DataSoure XML file>#<Table Id>

Testi yazarken Veri Kaynağı olarak "p:<DataSource çalışma zamanı adını>" belirtmeniz gerekir. Çalışma zamanında tam dizeyi (XML dosya adı ve tablo kimliğini birlikte) belirtmeniz gerekeceğini unutmayın. Veri kaynağınız çalışma zamanında sağlanıyorsa TableId değerinin test meta verileri olarak sağlanması beklenmemektedir. "Tablo:" ön eki, tablo veri kaynağı aradığınızı belirtir.

Bunu sürüm paylaşımında bulunan örneklerden biriyle deneyebilirsiniz:

te Examples\CPP.RuntimeDataSource.Example.dll /p:MyDataSource=Table:RuntimeDataSourceExample.xml#SimpleTable

Kaynak Olarak DataSource

TAEF, aşağıdakilerle uyumlu olduğu sürece DataSource'unuzu test modülünüzün kaynağı olarak eklemenize olanak tanır:

Yerel test modülleri söz konusu olduğunda, kaynak kimliği veya kaynak adı olarak DataSource'unuzu belirterek bunu yapabilirsiniz. Aşağıda bir kod örneği verilmiştir:

BEGIN_TEST_METHOD(ResourceNameDataSource)
    TEST_METHOD_PROPERTY(L"DataSource", L"Table:MyResourceName#SimpleTable")
END_TEST_METHOD()

"MyResourceName", ResourceDataSource.rc dosyasında tanımlanan kaynak adıdır:

MyResourceName DATASOURCE_XML "ResourceDataSource.xml"

Yönetilen test modülleri söz konusu olduğunda, kaynak yalnızca aşağıda gösterilen kaynak dosyası kod parçacığında gösterildiği gibi belirli bir şekilde belirtilebilir:

LANGUAGE_NEUTRAL_MANAGED_RESOURCES = CSharpAdvancedDataDrivenTests.xml

DataSource meta veri belirtimi, DataSource XML dosyasının belirtilmesi durumunda olduğu gibi kalır. Yönetilen koddaki örneğe benzer şekilde, kaynak adını XML dosya adıyla aynı yapabilirsiniz. Bu nedenle, TAEF'nin önce DataSource adıyla gerçek dosyanın varlığını arayacağını anlamak önemlidir. Böyle bir XML dosyası bulunamazsa, yalnızca o zaman test modülünde verilen kaynak adı veya kimliğiyle test kaynağını aramaya devam eder. DataSource'u kaynak olarak belirtmek için yeniden derleme gerektiğinden, geliştirme sırasında DataSource XML dosyasını test dll dosyasıyla aynı konuma kopyalayarak (ve kaynak adını XML dosya adıyla aynı olacak şekilde adlandırarak) bu tasarımdan yararlanabilirsiniz. Testi tamamladıktan sonra XML'yi kod dizinine kopyalayın ve kaynak olarak yeniden derleyin. XML dosyasını yürütme dizininden silmeyi unutmayın! :)

Örnek Kılavuzlar

Tablo tabanlı veri temelli testin çeşitli yönlerini kavramak için bazı örnek kılavuzları okuyun: