Я бы хотел начать использовать модульные тесты, но мне трудно понять, как я могу использовать их в моем текущем проекте.
Мой текущий проект - это приложение, которое собирает файлы в «Каталог». Затем Catalog
может извлекать информацию из содержащихся в ней файлов, например миниатюры и другие свойства. Пользователи также могут пометить файлы другими метаданными, такими как «Автор» и «Заметки». Его легко сравнить с приложением для создания фотоальбомов, таким как Picasa или Adobe Lightroom.
Я разделил код для создания и манипулирования Catalog
в отдельную DLL, которую я сейчас хотел бы протестировать. Тем не менее, большинство моих классов никогда не предназначены для самостоятельной реализации. Вместо этого все происходит через мой Catalog
класс. Например, я не могу проверить свой класс File
самостоятельно, так как File
доступен только через Catalog
.
В качестве альтернативы модульным тестам, мне кажется, для меня было бы больше смысла написать тестовую программу, которая выполняет ряд действий, включая создание каталога, повторное открытие созданного каталога и манипулирование содержимым каталог. Смотрите код ниже.
//NOTE: The real version would have code to log the results and any exceptions thrown
//input data
string testCatalogALocation = "C:\TestCatalogA"
string testCatalogBLocation = "C:\TestCatalogB"
string testFileLocation = "C:\testfile.jpg"
string testFileName = System.IO.Path.GetFileName(testFileLocation);
//Test creating catalogs
Catalog catAtemp = Catalog(testCatalogALocation)
Catalog catBtemp = Catalog(testCatalogBLocation );
//test opening catalogs
Catalog catA = Catalog.OpenCatalog(testCatalogALocation);
Catalog catB = Catalog.OpenCatalog(testCatalogBLocation );
using(FileStream fs = new FileStream(testFileLocation )
{
//test importing a file
catA.ImportFile(testFileName,fs);
}
//test retrieving a file
File testFile = catA.GetFile(System.IO.Path.GetFileName(testFileLocation));
//test copying between catalogs
catB.CopyFileTo(testFile);
//Clean Up after test
System.IO.Directory.Delete(testCatalogALocation);
System.IO.Directory.Delete(testCatalogBLocation);
Во-первых, я что-то упустил? Есть ли какой-нибудь способ для модульного тестирования такой программы? Во-вторых, есть ли какой-нибудь способ создать тест процедурного типа, подобный приведенному выше коду, но можно ли использовать преимущества инструментов тестирования, встроенных в Visual Studio? Позволит ли мне сделать «Общий тест» в VS2010?
Обновление
Спасибо всем за ответы. На самом деле мои классы на самом деле наследуют от ряда интерфейсов. Вот диаграмма классов для всех, кто заинтересован. На самом деле у меня больше интерфейсов, чем классов. Я просто упустил интерфейсы из моего примера для простоты.
Спасибо за все предложения по использованию насмешек. Я слышал этот термин в прошлом, но так и не понял, что такое «издевательство» до сих пор. Я понимаю, как я мог создать макет моего интерфейса IFile, который представляет один файл в каталоге. Я также понимаю, как я мог создать фиктивную версию своего интерфейса ICatalog, чтобы проверить взаимодействие двух каталогов.
Пока я не понимаю, как я могу протестировать свои конкретные реализации ICatalog, поскольку они тесно связаны с их внутренними источниками данных. На самом деле вся цель моих каталожных классов - читать, записывать и манипулировать их внешними данными / ресурсами.