/// <summary> /// 测试模板类模式 /// </summary> [TestFixture] public abstract class TemplateStringParserTests { [Test] public abstract void TestGetStringVersionFromHeader_SingleDigit_Found(); [Test] public abstract void TestGetStringVersionFromHeader_WithMinorVersion_Found(); [Test] public abstract void TestGetStringVersionFromHeader_WithRevision_Found(); } [TestFixture] public class XMLStrignParserTests : TemplateStringParserTests { protected IStringParser GetParser(string input) { return new XMLStringParser(input); } [Test] public override void TestGetStringVersionFromHeader_SingleDigit_Found() { IStringParser parser = GetParser("<Header>1</Header>"); string versionFromHeader = parser.GetTextVersionFromHeader(); Assert.AreEqual("1", versionFromHeader); } [Test] public override void TestGetStringVersionFromHeader_WithMinorVersion_Found() { IStringParser parser = GetParser("<Header>1.1</Header>"); string versionFromHeader = parser.GetTextVersionFromHeader(); Assert.AreEqual("1.1", versionFromHeader); } [Test] public override void TestGetStringVersionFromHeader_WithRevision_Found() { IStringParser parser = GetParser("<Header>1.1.1</Header>"); string versionFromHeader = parser.GetTextVersionFromHeader(); Assert.AreEqual("1.1", versionFromHeader); } } |
使用此模式可以确保开发者不会遗忘重要的测试,基类包含了抽象的测试方法,派生类必须实现这些抽象方法。
(3)抽象测试驱动类模式
/// <summary> /// 抽象“填空”测试驱动类模式 /// </summary> public abstract class FillInTheBlankStringParserTests { // 返回接口的抽象方法 protected abstract IStringParser GetParser(string input); // 抽象输入方法(属性),为派生类提供特定格式的数据 protected abstract string HeaderVersion_SingleDigit { get; } protected abstract string HeaderVersion_WithMinorVersion { get; } protected abstract string HeaderVersion_WithRevision { get; } // 如果需要,预先为派生类定义预期的输出 public const string EXPECTED_SINGLE_DIGIT = "1"; public const string EXPECTED_WITH_MINORVERSION = "1.1"; public const string EXPECTED_WITH_REVISION = "1.1.1"; [Test] public void TestGetStringVersionFromHeader_SingleDigit_Found() { string input = HeaderVersion_SingleDigit; IStringParser parser = GetParser(input); string versionFromHeader = parser.GetTextVersionFromHeader(); Assert.AreEqual(EXPECTED_SINGLE_DIGIT, versionFromHeader); } [Test] public void TestGetStringVersionFromHeader_WithMinorVersion_Found() { string input = HeaderVersion_WithMinorVersion; IStringParser parser = GetParser(input); string versionFromHeader = parser.GetTextVersionFromHeader(); Assert.AreEqual(EXPECTED_WITH_MINORVERSION, versionFromHeader); } [Test] public void TestGetStringVersionFromHeader_WithRevision_Found() { string input = HeaderVersion_WithRevision; IStringParser parser = GetParser(input); string versionFromHeader = parser.GetTextVersionFromHeader(); Assert.AreEqual(EXPECTED_WITH_REVISION, versionFromHeader); } } public class DBLogStringParserTests : GenericParserTests<DBLogStringParser> { protected override string GetInputHeaderSingleDigit() { return "Header;1"; } protected override string GetInputHeaderWithMinorVersion() { return "Header;1.1"; } protected override string GetInputHeaderWithRevision() { return "Header;1.1.1"; } } |
此模式在基类中实现测试方法,并提供派生类可以实现的抽象方法钩子。当然,只是大部分的测试代码在基类中,派生类也可以加入自己的特殊测试。
此模式的要点在于:你不是具体地测试一个类,而是测试产品代码中的一个接口或者基类。
当然,在.NET中我们也可以通过泛型来实现此模式,例如下面的代码:
public abstract class GenericParserTests<T> where T : IStringParser // 01.定义参数的泛型约束 { protected abstract string GetInputHeaderSingleDigit(); protected abstract string GetInputHeaderWithMinorVersion(); protected abstract string GetInputHeaderWithRevision(); // 02.返回泛型变量而非接口 protected T GetParser(string input) { // 03.返回泛型 return (T)Activator.CreateInstance(typeof(T), input); } [Test] public void TestGetStringVersionFromHeader_SingleDigit_Found() { string input = GetInputHeaderSingleDigit(); T parser = GetParser(input); bool result = parser.HasCorrectHeader(); Assert.AreEqual(false, result); } [Test] public void TestGetStringVersionFromHeader_WithMinorVersion_Found() { string input = GetInputHeaderWithMinorVersion(); T parser = GetParser(input); bool result = parser.HasCorrectHeader(); Assert.AreEqual(false, result); } [Test] public void TestGetStringVersionFromHeader_WithRevision_Found() { string input = GetInputHeaderWithRevision(); T parser = GetParser(input); bool result = parser.HasCorrectHeader(); Assert.AreEqual(false, result); } } public class DBLogStringParserTests : GenericParserTests<DBLogStringParser> { protected override string GetInputHeaderSingleDigit() { return "Header;1"; } protected override string GetInputHeaderWithMinorVersion() { return "Header;1.1"; } protected override string GetInputHeaderWithRevision() { return "Header;1.1.1"; } } |
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。