.NET单元测试的艺术-3.测试代码

发表于:2018-7-31 15:50

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Edison Chou    来源:博客园

  
   /// <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),我们将立即处理。
32/3<123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号