Советы по написанию MTLM Diagnostic Data Adapter
11/07/2011 Оставьте комментарий
Вы, конечно, знаете, что при запуске ручных и автоматических тестов можно сильно облегчить жизнь тестировщикам и собрать дополнительную диагностическую информацию, специфичную для Вашего продукта. Для этого надо написать специальный адаптер.
В MSDN хорошо описано, как это сделать. Тем не менее, я хочу поделиться несколькими советами, которые помогут потратить меньше времени на разработку и отладку.
Коллекторы и редакторы настроек
Это не очень следут из документации, но Вы можете написать несколько коллекторов для данных и использовать общий редактор настроек. Разумеется, это имеет смысл, если коллекторы используют общие настройки.
Настройки
Инфраструктура предоставляет хранить настройки коллектора в виде XML. В примере на MSDN используется прямой разбор XML для чтения параметров. Согласитесь, это не совсем правильно, как минимум – с точки зрения правильной декомпозиции. Вы же не хотите повторять этот код и коллекторе, который читает настройки, и в редакторе, который их ещё и пишет. Для того, чтобы код легко читался и поддерживался, я вынес настройки в отдельный класс, и использовал XML сериализацию для конвертации в XML. Получился вот такой код для загрузки:
public static LogsCollectorSettings CreateFromXmlNode(IXPathNavigable node)
{
if (node == null)
{
throw new ArgumentNullException("node");
}
LogsCollectorSettings settings;
var serializer = new XmlSerializer(typeof(LogsCollectorSettings));
var stringReader = new StringReader(node.CreateNavigator().InnerXml);
using (stringReader)
{
var xmlReader = XmlReader.Create(stringReader, new XmlReaderSettings {ConformanceLevel = ConformanceLevel.Fragment, CloseInput = false});
using (xmlReader)
{
settings = (LogsCollectorSettings)serializer.Deserialize(xmlReader);
}
}
return settings;
}
и сохранения:
public void SaveToXmlNode(IXPathNavigable node)
{
if (node == null)
{
throw new ArgumentNullException("node");
}
var serializer = new XmlSerializer(typeof(LogsCollectorSettings));
var stringWriter = new StringWriter(CultureInfo.InvariantCulture);
using (stringWriter)
{
XmlWriter xmlWriter = XmlWriter.Create(stringWriter, new XmlWriterSettings {OmitXmlDeclaration = true, CloseOutput = false});
using (xmlWriter)
{
serializer.Serialize(xmlWriter, this);
}
node.CreateNavigator().InnerXml = stringWriter.ToString();
}
}
в качестве node в обоих случаях может передаваться:
DataCollectorSettings.Configuration
или
DataCollectorSettings.DefaultConfiguration
Ну, разумеется, конфигурацию “по-умолчанию” надо только читать в коде редактора, в методе, который их выставляет. Кстати, настройки “по-умолчанию”, которые задаются в app.config-е, должны выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="DataCollectorConfiguration"
type="Microsoft.VisualStudio.TestTools.Execution.DataCollectorConfigurationSection,
Microsoft.VisualStudio.QualityTools.ExecutionCommon,
Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
</configSections>
<DataCollectorConfiguration xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010">
<DataCollector typeUri="datacollector://QuestSoftware/LogFilesCollector/1.0">
<DefaultConfiguration>
<LogsCollectorSettings xmlns="http://quest.com/schemas/ORAD/LogsCollectorSettings/1.0">
<WhenClean>CleanOnTestStart</WhenClean>
<CompressData>true</CompressData>
</LogsCollectorSettings>
</DefaultConfiguration>
</DataCollector>
<DataCollector typeUri="datacollector://QuestSoftware/LogBlobsCollector/1.0">
<DefaultConfiguration>
<LogsCollectorSettings xmlns="http://quest.com/schemas/ORAD/LogsCollectorSettings/1.0">
<WhenClean>CleanOnTestStart</WhenClean>
<CompressData>true</CompressData>
</LogsCollectorSettings>
</DefaultConfiguration>
</DataCollector>
</DataCollectorConfiguration>
</configuration>
Отладка коллектора и редактора настроек
Для отладки написанного кода, необходимо воспользоваться инструкцией по установке коллектора и редактора настроек. Помните о том, что инфраструктура для тестирования испльзуется как и Microsoft Visual Studio 2010 IDE, так и Microsot Test Manager 2010. Для того чтобы они “увидели” новое расширение, скомпилированные файлы нужно копировать в
“%Program Files%\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\DataCollectors”
до запуска этих программ. Очевидно, что сборки будут заблокированы, и Вы не сможете их обновить до тех пор, пока использующие их программы не будут закрыты. Для удобства я придерживался следующих правил:
- Проект открывается в IDE в тот момент, когда мои сборки удалены из директории, указанной выше. В противном случае, IDE придётся закрывать перед отладкой.
- Для отладки используется Test Manager, который запускается только после того, как скомпилированные сборки помещены в директорию с коллекторами.
- После окончания отладки, сборки удаляются из директории.
К сожалению, в Test Manager глотаются все ошибки при инициализации редактора, т.е. Вы не узнаете о том, что инициализация прошла неуспешно. Это ещё один повод вынести максимум логики в отдельный класс и отлаживать его отдельно — например, запуская модульные тесты.
Тем не менее, отладка может понадобиться. Её легко произвести, если после запуска Test Manager-а, присоединиться к нему отладчиком (процесс “mtm.exe”) и поставить точки останова на всех интересующих Вас методах коллектора или редактора.
Установка готового адаптера
Несмотря на то, что установка заключается в копировании сборок в директорию, Ваши тестировщики будут очень признательны за простейший инсталлятор, которй это сделает. Ведь им надо будет распространять адаптер на большое количество машин. Написать простой инсталлятор можно используя Windows Installer XML, а распространять его на виртуалки следуя ALM Rangers Lab Management Guide.