在软件开发过程中,测试是不可或缺的一环。随着软件版本的迭代,测试用例和测试套件也需要不断更新以适应新的功能和修复。本文将介绍如何使用Team Foundation Server (TFS) 的API来克隆测试套件,以便于在不同版本或补丁中重用现有的测试用例。
有一个名为“基础测试集”的测试计划,其中包含了代表不同测试集合的套件。例如,它包含了回归测试、冒烟测试等套件。每个发布或补丁,都会运行不同的测试集合。将所需的套件复制到该版本的测试计划中。
为了详细说明测试系统和需求,为软件的每个版本/发布创建一个测试计划。在计划中,为每个冲刺、发布候选版本、一般发布和补丁设置一个套件。每个补丁发布都运行相同的测试用例集,但如果复制测试用例的新副本,每个补丁或发布都会有大量的测试用例。这可以通过Microsoft Test Manager (MTM) 完成,但并非每个人都可以访问MTM,而且它可能会成为负担。
请自行承担使用此代码的风险。下面概述的系统在当前系统上没有问题,但修改代码或错误可能会导致TFS系统出现问题。直接使用API工作时,需要自行承担风险。为了安全起见,在正常TFS系统的开发环境克隆中测试了下面的代码。
需要添加对TFSDLLs的引用。为此,使用的是Visual Studio 12中的DLLs。大多数DLLs可以在以下路径找到:
C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ReferenceAssemblies
一直在将所有TFSAPI代码添加到一个名为TFSWrapper的项目中,这是一个库,可以由UI项目、Windows服务项目或任何需要的项目使用。
以下using语句可以放在喜欢的任何类中,但将其放在包含所有TFSAPI方法的上述项目中。
C# using Microsoft.TeamFoundation.TestManagement.Client;
首先,需要获取测试管理服务并调用GetTeamProject以获取ITestManagementTeamProject的实例。这些值是硬编码的,但可以将变量放入配置或其他数据存储系统中。
public static ITestManagementTeamProject GetTestmanagementProject(string projectName)
{
NetworkCredential networkCredentials = new NetworkCredential(
"username",
"password",
"domain");
var tfsUri = "https://tfs.company.com/tfs";
var myTFSTeamProjectCollection = new TfsTeamProjectCollection(
TfsTeamProjectCollection.GetFullyQualifiedUriForName(tfsUri),
networkCredentials);
ITestManagementService tms = myTFSTeamProjectCollection.GetService;
return tms.GetTeamProject(projectName);
}
现在已经可以访问测试管理团队项目,可以开始处理测试项。由于想要克隆测试套件,需要使用其Id来检索它。将设置一个方法,可以通过其Id获取测试套件。
public static ITestSuiteBase GetTestSuite(int id, string teamProjectName)
{
return GetTestManagementProject(teamProjectName).TestSuites.Find(id);
}
接下来,从Id获取套件,并开始克隆。
public static IStaticSuiteBase CopyStaticTestSuiteWithNewEntries(
int fromSuiteID,
int toSuiteID,
string teamProjectName)
{
var suiteToClone = (IStaticTestSuite)GetTestSuite(fromSuiteID, teamProjectName);
var suiteToCloneInto = (IStaticTestSuite)GetTestSuite(toSuiteID, teamProjectName);
if (suiteToClone.TestSuiteType != TestSuiteType.StaticTestSuite)
{
throw new NotSupportedException("Only Static Test Suites Can be Cloned.");
}
var clone = CopyStaticSuite(suiteToClone, suiteToCloneInto);
return clone;
}
需要克隆套件及其所有子套件,因此将设置一个递归方法。这有一个外部方法调用,接下来会讲到,但现在只需按照注释操作。
public static IStaticTestSuite CopyStaticSuite(IStaticTestSuite originalTestSuite, IStaticTestSuite testSuiteToCloneInto)
{
IStaticTestSuite clone;
clone = CreateStaticSuiteWithoutChildren(originalTestSuite.Project.TeamProjectName, originalTestSuite, testSuiteToCloneInto);
testSuiteToCloneInto.Entries.Add(clone);
foreach (var entry in originalTestSuite.Entries)
{
if (entry.EntryType == TestSuiteEntryType.TestCase)
{
clone.TestCases.AddCases(new[] { entry.TestCase });
}
else if (entry.EntryType == TestSuiteEntryType.StaticTestSuite)
{
CopyStaticSuite((IStaticTestSuite)entry.TestSuite, clone);
}
}
return clone;
}
现在来创建CreateStaticSuiteWithoutChildren方法,这个名字是因为系统可以克隆带有子项的测试套件。在这里,只想创建一个新的静态测试套件并复制设置。
public static IStaticTestSuite CreateStaticSuiteWithoutChildren(string projectName, IStaticTestSuite suiteToClone)
{
IStaticTestSuite newSuite = GetTestManagementProject(projectName).TestSuites.CreateStatic();
newSuite.Title = suiteToClone.Title;
newSuite.Description = suiteToClone.Description;
return newSuite;
}
现在有了所需的一切,将留下设置UI或控制台应用程序或想以任何方式使用系统的设置。要调用代码,只需要传入套件的Ids和测试计划的名称。可以使用返回的值进行日志记录和消息传递。
var suiteToCopyId = 123;
var suiteToCopyToId = 456;
var projectName = "default";
var clonedSuite = CopyStaticTestSuiteWithNewEntries(suiteToCopyId, suiteToCopyToId, projectName);
console.WriteLine($"New Suite {clonedSuite.Id} cloned from Suite {suiteToCopyId} into Suite {suiteToCopyToId}");
public static CloneOperationInformation CloneTestSuiteAndCloneTests(
string projectName,
int sourceSuiteId,
int destinationSuiteId)
{
CloneOptions options = new CloneOptions();
var testManagementProject = GetTestManagementProject(projectName);
var testSuites = testManagementProject.TestSuites;
var result = testSuites.BeginCloneOperation(sourceSuiteId, destinationSuiteId, options, projectName);
var info = testSuites.GetCloneOperationInformation(result);
return info;
}