建立診斷資料配接器的範例專案
"MyDiagnosticDataAdapter" 是一個簡易的診斷資料配接器,可在您執行測試時將記錄檔附加至測試結果。
在安裝診斷資料收集器或組態編輯器的電腦上,您必須具有其系統管理權限。
範例
本範例示範如何執行下列工作:
套用屬性讓 Microsoft Test Manager 可發現某個類別,而將其做為診斷資料配接器。
套用屬性讓 Microsoft Test Manager可發現某個使用者控制項類別,而將其做為可用來變更診斷資料配接器組態的編輯器。
存取預設組態資料。
註冊特定的診斷資料收集事件。
藉由將記錄檔傳送至 DataCollectionSink 來附加記錄檔。
// My Data Collector Class
using Microsoft.VisualStudio.TestTools.Common;
using Microsoft.VisualStudio.TestTools.Execution;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System;
namespace MyCompany.MyDiagnosticDataAdapters
{
// Provide a URI and friendly name for your diagnostic data adapter
[DataCollectorTypeUri("datacollector://MyCompany/MyDataCollector/1.0")]
[DataCollectorFriendlyName("Collect Log Files sample", false)]
// Designate your chosen configuration editor
[DataCollectorConfigurationEditor(
"configurationeditor://MyCompany/MyDataConfigEditor/1.0")]
public class MyDataCollector : DataCollector
{
private DataCollectionEvents dataEvents;
private DataCollectionLogger dataLogger;
private DataCollectionSink dataSink;
private XmlElement configurationSettings;
// Required method called by the testing framework
public override void Initialize(
XmlElement configurationElement,
DataCollectionEvents events,
DataCollectionSink sink,
DataCollectionLogger logger,
DataCollectionEnvironmentContext environmentContext)
{
dataEvents = events; // The test events
dataLogger = logger; // The error and warning log
dataSink = sink; // Saves collected data
// Configuration from the test settings
configurationSettings = configurationElement;
// Register common events for the data collector
// Not all of the events are used in this class
dataEvents.SessionStart +=
new EventHandler<SessionStartEventArgs>(OnSessionStart);
dataEvents.SessionEnd +=
new EventHandler<SessionEndEventArgs>(OnSessionEnd);
dataEvents.TestCaseStart +=
new EventHandler<TestCaseStartEventArgs>(OnTestCaseStart);
dataEvents.TestCaseEnd +=
new EventHandler<TestCaseEndEventArgs>(OnTestCaseEnd);
dataEvents.DataRequest +=
new EventHandler<DataRequestEventArgs>(OnDataRequest);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
dataEvents.SessionStart -=
new EventHandler<SessionStartEventArgs>(OnSessionStart);
dataEvents.SessionEnd -=
new EventHandler<SessionEndEventArgs>(OnSessionEnd);
dataEvents.TestCaseStart -=
new EventHandler<TestCaseStartEventArgs>(OnTestCaseStart);
dataEvents.TestCaseEnd -=
new EventHandler<TestCaseEndEventArgs>(OnTestCaseEnd);
dataEvents.DataRequest -=
new EventHandler<DataRequestEventArgs>(OnDataRequest);
}
}
#region Event Handlers
public void OnSessionStart(object sender, SessionStartEventArgs e)
{
// TODO: Provide implementation
}
public void OnSessionEnd(object sender, SessionEndEventArgs e)
{
// TODO: Provide implementation
}
public void OnTestCaseStart(object sender, TestCaseEventArgs e)
{
// TODO: Provide implementation
}
public void OnTestCaseEnd(object sender, TestCaseEndEventArgs e)
{
// Get any files to be collected that are
// configured in your test settings
List<string> files = getFilesToCollect();
// For each of the files, send the file to the data sink
// which will attach it to the test results or to a bug
foreach (string file in files)
{
dataSink.SendFileAsync(e.Context, file, false);
}
}
public void OnDataRequest(object sender, DataRequestEventArgs e)
{
// TODO: Provide implementation
// Most likely this occurs because a bug is being filed
}
#endregion
// A private method to collect the configured file names
private List<string> getFilesToCollect()
{
// Seetup namespace manager with our namespace
XmlNamespaceManager nsmgr =
new XmlNamespaceManager(
configurationSettings.OwnerDocument.NameTable);
nsmgr.AddNamespace("ns",
"http://MyCompany/schemas/MyDataCollector/1.0");
// Find all of the "File" elements under our configuration
XmlNodeList files =
configurationSettings.SelectNodes(
"//ns:MyDataCollector/ns:File");
// Build the list of files to collect from the
// "FullPath" attributes of the "File" nodes.
List<string> result = new List<string>();
foreach (XmlNode fileNode in files)
{
XmlAttribute pathAttribute =
fileNode.Attributes["FullPath"];
if (pathAttribute != null &&
!String.IsNullOrEmpty(pathAttribute.Value))
{
result.Add(pathAttribute.Value);
}
}
return result;
}
}
}
這是診斷資料配接器的範例組態編輯器。請將使用者控制項加入至專案中,並以標籤 ("Name of Log File:") 和名為 "FileTextBox" 的文字方塊,建立簡單的表單。
using Microsoft.VisualStudio.TestTools.Common;
using Microsoft.VisualStudio.TestTools.Execution;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System;
namespace MyCompany.DiagnosticDataAdapters.ConfigurationEditors
{
[DataCollectorConfigurationEditorTypeUri(
"configurationeditor://MyCompany/MyConfigEditor/1.0")]
public partial class MyDataConfigEditor :
UserControl, IDataCollectorConfigurationEditor
{
private DataCollectorSettings collectorSettings;
// Create a private property for the service provider
private IServiceProvider ServiceProvider { get; set; }
// Constructor
public MyConfigurationEditor()
{
InitializeComponent();
}
// Required method called by the testing framework
public void Initialize(
IServiceProvider svcProvider,
DataCollectorSettings settings)
{
ServiceProvider = svcProvider;
collectorSettings = settings;
// Display the file name as listed in the settings file.
// If the configuration has not been updated before, this
// data will be provided by the default configuration
// section from <nameofcollector>.dll.config:
// <DefaultConfiguration>
// <MyCollectorName
// xmlns="http://MyCompany/schemas/ProductName/Version");
// <File FullPath="C:\temp\logfile1.txt" />
// </MyCollectorName>
// </DefaultConfiguration>
this.SuspendLayout();
this.FileTextBox.Text = GetText(collectorSettings.Configuration);
this.ResumeLayout();
}
// Can be used to verify data before saving it
public bool VerifyData()
{
// Not currently verifying data
return true;
}
// Reset to default value from XML configuration
// using a custom method
public void ResetToAgentDefaults()
{
this.FileTextBox.Text =
getText(collectorSettings.DefaultConfiguration);
}
// Saves data changed in the editor to the test configuration
// settings. Does not change the default value.
public DataCollectorSettings SaveData()
{
collectorSettings.Configuration.InnerXml =
String.Format(
@"<MyCollectorName
http://MyCompany/schemas/MyDataCollector/1.0"">
<File FullPath=""{0}"" />
</MyCollectorName>",
FileTextBox.Text);
return collectorSettings;
}
// Reads the configuration settings
private string getText(XmlElement element)
{
// Setup namespace manager with our namespace
XmlNamespaceManager nsmgr =
new XmlNamespaceManager(
element.OwnerDocument.NameTable);
// Find all the "File" elements under our configuration
XmlNodeList files = element.SelectNodes("//ns:MyDataCollector/ns:File", nsmgr);
string result = String.Empty;
if (files.Count > 0)
{
XmlAttribute pathAttribute = files[0].Attributes["FullPath"];
if (pathAttribute != null &&
!String.IsNullOrEmpty(pathAttribute.Value))
{
result = pathAttribute.Value;
}
}
return result;
}
}
}
以下是診斷資料收集器組態編輯器的範例組態檔。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section
name="DataCollectorConfiguration"
type="Microsoft.VisualStudio.QualityTools.Execution.DataCollectorConfigurationSection,
Microsoft.visualStudio.QualityTools.ExecutionCommon,
Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b03f5f7f11d50a3a" />
</configSections>
<DataCollectorConfiguration
xmlns="https://microsoft.com/schemas/VisualStudio/TeamTest/11">
<DataCollector
typeUri="datacollector://MyCompany/MyDataCollector/1.0">
<DefaultConfiguraton>
<!-- Your default config settings-->
<File FullPath="c:\temp\logfile1.txt" />
</DefaultConfiguration>
</DataCollector>
</DataCollectorConfiguration>
</configuration>
編譯程式碼
建立此診斷配接器的程式碼專案
建立名為 "MyDataCollector" 的新類別庫專案。
在 [方案總管] 中,以滑鼠右鍵按一下專案名稱,接著選擇 [屬性]。若要選取要加入的資料夾,請點選 [參考路徑],然後選取省略符號 (…)。
[選取參考路徑] 對話方塊隨即顯示。
根據您的安裝路徑選取下列路徑:Program Files\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies。選擇 [確定]。
若要將資料夾加入至您的參考路徑,請點選 [加入資料夾]。
資料夾會顯示在參考路徑清單中。
點選 [全部儲存] 圖示,以儲存參考路徑。
加入組件 Microsoft.VisualStudio.QualityTools.ExecutionCommon。
在 [方案總管] 中,以滑鼠右鍵按一下 [參考],再點選 [加入參考]。
選取 [瀏覽] 並找出 Microsoft.VisualStudio.QualityTools.ExecutionCommon.dll。
此組件將位於 Program Files\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies 中。
選擇 [確定]。
加入組件 Microsoft.VisualStudio.QualityTools.Common。
在 [方案總管] 中,以滑鼠右鍵按一下 [參考],然後選取 [加入參考]。
選取 [瀏覽] 並找出 Microsoft.VisualStudio.QualityTools.Common.dll。
此組件將位於 Program Files\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies 中。
選擇 [確定]。
將本文件前段所列的診斷資料配接器類別,複製到您類別庫的類別中。儲存此類別。
若要將使用者控制項加入至專案中,請以滑鼠右鍵按一下 [方案總管] 中的 MyDataCollector 專案,指向 [加入],然後點選 [使用者控制項]。選擇 [加入]。
使用工具列,將標籤加入至使用者控制項,然後將 [Text] 屬性變更為 [檔案名稱:]。
使用工具列,將文字方塊加入至使用者控制項,然後將名稱變更為 textBoxFileName。
以滑鼠右鍵按一下 [方案總管] 中的使用者控制項,然後點選 [檢視程式碼]。 將此使用者控制項類別取代為本文件前段所列的使用者控制項類別。儲存此類別。
注意事項 根據預設,使用者控制項的名稱是 UserControl1。請確定使用者控制項類別程式碼使用的是您的使用者控制項名稱。
若要建立組態檔,請以滑鼠右鍵按一下 [方案總管] 中的方案,指向 [加入],然後點選[新增項目]。選取 [應用程式組態檔],然後選取 [新增]。隨即將 App.config 檔案加入您的方案中。
將先前提供之範例中的 XML 複製到 XML 檔中。儲存檔案。
建置方案,然後將建置的組建和 App.config 檔案複製至 Program Files\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies\DataCollectors 目錄中。
建立使用此自訂資料診斷配接器的測試設定。設定用以收集現存檔案的測試設定。
如果您從 Microsoft Test Manager執行測試,您可以在執行測試前將這些測試設定指派給測試計劃,或使用 [以選項執行] 命令來指派測試設定和覆寫測試設定。如需測試設定的詳細資訊,請參閱使用測試設定安裝電腦和收集診斷資訊。
使用已選取您診斷資料配接器的測試設定來執行您的測試。
執行測試時,您所指定的資料檔案會附加至測試結果中。