在VSTS中创建Web Test的插件

做过单元测试的朋友都知道,几乎每一个单元测试的框架都提供了类似于TestInitialize、TestCleanup这样的操作,可以在测试的开始和完成测试以后让我们处理一些问题,例如初始化一些数据,或者销毁一些数据等操作。在VSTS中有一种测试类型叫”Web测试”,它由一系列 HTTP 请求组成,通过发出 HTTP 请求在协议层工作。Web测试没有单独的TestInitialize、TestCleanup操作,但是VSTS所提供的Web Test插件能够帮助我们完成这样的工作。以下是MSDN对Web测试的定义:

使用 Web 测试插件,可以隔离代码并在 Web 测试中的主要声明性语句外部重用代码。自定义的 Web 测试插件为在运行 Web 测试时调用某些代码提供了途径。在每个测试迭代中,Web 测试插件都要运行一次。此外,如果重写测试插件中的 PreRequest 或 PostRequest 方法,这些请求插件将分别在每个请求之前或之后运行。

可见Web测试插件给使用者带来了很大的灵活性,下面就看看如何创建一个Web测试插件。

1. 创建一个新的类库项目,这个项目是一个独立的可重用的类库,所创建的Web测试插件可以在不同的包含有Web测试的项目中使用。

2. 在该类库项目中添加对“Microsoft.VisualStudio.QualityTools.WebTestFramework”的引用,该Dll是在.NET选项卡上

3. 在该类库项目中从WebTestPlugin派生出一个自定义的Web测试插件类

4. 重写相关的基类方法,例如 PreRequest、 PreWebTest、 PostWebTest等

5. 打开包含有Web Test的项目,并且在该项目中引用刚才添加的包含有自定义Web测试插件的类库项目

6. 打开需要调用Web测试插件的Web测试,点击”Add Web Test Plug-in”,选择刚才编写好的Web插件,完成。

以下是一个Web测试插件的实例代码,该插件重写了PreWebTest方法,所以会在Web测试执行之前运行一次。改插件的作用就是在每次运行Web测试之前,会读取一个配置文件,然后把相关的配置写到Web测试的Context中。

public class FilterRuleWebPlugin : Microsoft.VisualStudio.TestTools.WebTesting.WebTestPlugin
{
	static readonly string key = "RuleName";
	public override void PreWebTest(object sender, PreWebTestEventArgs e)
	{
		base.PreWebTest(sender, e);
		//Add the new context
		if (!e.WebTest.Context.ContainsKey(key))
		{
			e.WebTest.Context.Add(key, string.Empty);
		}
		string filter = GetFilter();
		if (string.IsNullOrEmpty(filter))
		{
			e.WebTest.Context[key] = "default";
		}
		else
		{
			e.WebTest.Context[key] = filter;
		}
	}

	private string GetFilter()
	{
		string filter = string.Empty;
		XmlDocument doc = new XmlDocument();
		try
		{
			doc.Load("Config.xml");
			if (doc != null)
			{
				filter = doc.SelectSingleNode("Settings/Filter").InnerText;
			}
		}
		catch (Exception)
		{
			return "LoadFilterError";
		}
		return filter;
	}
}

我们还可以在Web测试插件中定义一些公开的属性(Property),利用公开的属性,可以在运行Web测试之前对一些参数的输入进行指定。

VSTS的Web测试用起来挺方法,功能也挺强大,如果大家在使用的过程中遇到什么不爽的事情,可以尝试自己编写Web测试插件来改变那些不爽的状态。;-)Web测试插件还有很多的应用场景,今天抛砖引玉啊。

Leave a Reply

Your email address will not be published. Required fields are marked *