29 October 2008
CSV у якості DataSource
Для Data-Driven тестів я завжди використовував Excel, легко редагувати, легко під’єднати, тощо. Десь з тиждень назад розпочалась нова ера мого життя ;), мій дев лід вказав на старе як мир правило.
Будь який код повинен версіонуватися!
Все просто. По-перше, в тексті найменша зміна яка піддається діфам та мержам це один символ. В бінарному файлі, тільки сам файл. По-друге, для Data-Driven тестів, Дата це код.
Ну і добре! Принаймні два рішення. Перше це XML, а друге CSV. XML я одразу відкинув, купа сміття усі ті теги та атрибути. Для табулярних даних це просто оверкіл. Отже CSV.
Головне правило для роботи з MSTest Data-Driven тестами.
Якщо тест каже піти подивитись Troubleshooting Data-Driven Unit Tests, це треба зробити.
Наприклад я ніколи не читаю щось де є слово Troubleshooting. А тому я витратив декілька годин, на дебаггінг студії, ODBC провайдера, пошуку в інеті, тощо.
На сторінці Troubleshooting Data-Driven Unit Tests можна знайти нормальні рядки під’єднання, з деякими подробицями. Наприклад:
Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\;Extended Properties="text;HDR=Yes;FMT=Delimited”
Tip For the test.csv file, use test#csv as the table name.
Note HDR=Yes means that the first row contains column names, not actual data.
Отже правила.
1) Крапка в назві файлу повинна бути замінена на “#”. Інше рішення це зовсім прибрати розширення, але реальний файл тоді повинен мати розширення “.txt”.
2) CSV файли повинні бути в окремій папці. Я на 100% не розумію проблему, але схоже що, з якогось переляку, драйвер перебирає усі файли, і валиться якщо йому щось не зрозуміло.
3) CSV файлу начхати на формат в якому ви туди щось запишете, але тести працювати не будуть якщо колонки не будуть текстовими. Я знаю два шляхи, якийсь там inf файл в директорію. Але це складно. Другий просто всі значення огортати лапками. Останнє стовідсотково працює.
Приклад тесту
[TestMethod]
[DataSource("System.Data.OleDb",
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.\\Data\\;Extended Properties=\"text;HDR=Yes;FMT=Delimited\"",
"ValidPostalCodes#csv", DataAccessMethod.Sequential)]
[DeploymentItem("\\UnitTests\\Data\\ValidPostalCodes.csv", "Data")]
public void Validator_Should_Accept_Example_Postal_Code()
Приклад файлу
PostalCode,Comment
"1555-1899", "We allow dashes"
"184878848", "9 Digts is maximum"
"1", "1 digist is also valid postal code"
Цікавлюсь DDD. Більшість часу витрачаю на доньку. А ще вел!