CruiseControl中使用NUnit中测试WEB服务
我的项目需要在CruiseControl中自动测试WEB服务,测试需满足下列条件:
* 不依赖于IIS
* 不对WebService做部署,直接在其CC编译的生成目录中运行WEB服务
如果满足以上需求,当然也可以使用相同方式在VS和CC里测试网页。
在网上找到了SCOTT的文章NUnit Unit Testing of ASP.NET Pages, Base Classes, Controls and other widgetry using Cassini (ASP.NET Web Matrix/Visual Studio Web Developer),使用Cassini来做果然方便。
自己写了个帮助类(见页尾),然后这样使用(在TestFixtureSetUp中运行Cassini,返回其服务地址给测试使用):
* 不依赖于IIS
* 不对WebService做部署,直接在其CC编译的生成目录中运行WEB服务
如果满足以上需求,当然也可以使用相同方式在VS和CC里测试网页。
在网上找到了SCOTT的文章NUnit Unit Testing of ASP.NET Pages, Base Classes, Controls and other widgetry using Cassini (ASP.NET Web Matrix/Visual Studio Web Developer),使用Cassini来做果然方便。
自己写了个帮助类(见页尾),然后这样使用(在TestFixtureSetUp中运行Cassini,返回其服务地址给测试使用):
[TestFixtureSetUp]
public void Init()
{
_cassni = new CassiniHelper();
_cassni.Start();
//你可如此获得Cassini运行起来的WEB服务地址
//config.CurrentServiceEntryUrl = _cassni.WebServerUrl;
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
_cassni.Close();
}
public void Init()
{
_cassni = new CassiniHelper();
_cassni.Start();
//你可如此获得Cassini运行起来的WEB服务地址
//config.CurrentServiceEntryUrl = _cassni.WebServerUrl;
}
[TestFixtureTearDown]
public void FixtureTearDown()
{
_cassni.Close();
}
- CassiniHelper
internal class CassiniHelper
{
private int _webServerPort = 26610;
private Server _webServer;
private readonly string _webServerVDir = "/ws";
private string _workingPath;
private string _webServerUrl;
private string _abstractPathFromTestToWebService = @"..\..\..\WebService";
public CassiniHelper()
{
SetWebServerUrl();
}
public int WebServerPort
{
get { return _webServerPort; }
set
{
_webServerPort = value;
SetWebServerUrl();
}
}
public string WebServerUrl
{
get { return _webServerUrl; }
set { _webServerUrl = value; }
}
/// <summary>
/// 从测试案例程序集所在目录到WEBServer所在目录的相对路径
/// </summary>
public string AbstractPathFromTestToWebService
{
get { return _abstractPathFromTestToWebService; }
set { _abstractPathFromTestToWebService = value; }
}
/// <summary>
/// WEB服务的虚拟路径
/// </summary>
public string WebServerVDir
{
get { return _webServerVDir; }
}
public void Start()
{
if(!Directory.Exists(_workingPath))
throw new DirectoryNotFoundException(_workingPath);
_webServer = new Server(_webServerPort, WebServerVDir, _workingPath);
_webServer.Start();
}
public void Close()
{
try
{
if (_webServer != null)
{
_webServer.Stop();
_webServer = null;
}
}
catch { }
}
private void SetWebServerUrl()
{
string currentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
DirectoryInfo dinfo = new DirectoryInfo(Path.Combine(currentPath, _abstractPathFromTestToWebService));
_workingPath = dinfo.FullName;
//拷贝Cassini.dll到web服务的bin目录下
string cassini = "Cassini.dll";
File.Copy(Path.Combine(currentPath, cassini), Path.Combine(Path.Combine(_workingPath,"bin"),cassini));
_webServerUrl = String.Format("http://localhost:{0}{1}", _webServerPort, WebServerVDir);
}
}