【问题标题】:How-to create a simple example Console application for developing separate classes for test driven development?如何创建一个简单的示例控制台应用程序来为测试驱动开发开发单独的类?
【发布时间】:2009-05-01 07:04:13
【问题描述】:

我的目的是创建一个简单、易于调试的控制台应用程序,它将作为 C# 中测试驱动开发单个类的模板(或起点)。目的是有一个简单的文件夹,这个控制台应用程序将驻留,只需复制粘贴文件夹打开新项目并开始编写新类。一旦测试了类的所有功能(最好测试应该在同一个文件(或至少命名空间)中),该类将被允许进入更大的项目。我正在使用 NUnit 和 log4net。如果你这样做“小型测试驱动单元构建”方法您是如何实现的。请发布一些代码或解释。如果您不使用,请提供解释为什么? 这是代码(配置数据也粘贴为cmets ...)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using log4net;
using log4net.Config;
using NUnit.Framework;

namespace NUnitSimple
{

  class TheClassToTest_Substractor
  {

    private static readonly ILog logger =
         LogManager.GetLogger ( typeof ( TheClassToTest_Substractor ) );



    public static void Substract ( int intToSusbractFrom , int intToSubstract , ref int intTheResult)
    {
     intTheResult = intToSusbractFrom - intToSubstract ; 
    }


    static void Main ( string[] args )
    {
      DOMConfigurator.Configure (); //tis configures the logger 


      logger.Info ( " START " );
      logger.Info ( " Hit a key to exit " );
      Console.ReadLine ();


    } //eof method 



  } //eof class 

  [TestFixture]//telling NUnit that this class contains test functions 
public class TestTheClassToTest_Substractor
{ 

     [Test]//telling NUnit that this function should be run during the tests 
    public void TestSubstractOk() 
    { 
       int intToSusbractFrom = 10 ; 
       int intToSubstract = 4 ; 
        int intTheResult = 0 ;
       TheClassToTest_Substractor.Substract ( intToSusbractFrom , intToSubstract , ref intTheResult ) ;
        Assert.AreEqual (  6 , intTheResult);
    }



     [Test]//telling NUnit that this function should be run during the tests 
     public void TestSubstractNOK ()
     {
       int intToSusbractFrom = 10;
       int intToSubstract = 4;
       int intTheResult = 0;
       TheClassToTest_Substractor.Substract ( intToSusbractFrom, intToSubstract, ref intTheResult );
       Assert.AreNotEqual ( 3, intTheResult );
     }

} //eof class 


} //eof namespace 




#region TheAppConfig
/*
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="log4net"
         type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
  </configSections>
  <log4net>
    <appender name="LogFileAppender" type="log4net.Appender.FileAppender">
      <param name="File" value="Program.log" />
      <param name="AppendToFile" value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header] \r\n" />
        <param name="Footer" value="[Footer] \r\n" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c %m%n" />
      </layout>
    </appender>

    <appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
      <mapping>
        <level value="ERROR" />
        <foreColor value="White" />
        <backColor value="Red, HighIntensity" />
      </mapping>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>


    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.2.10.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
      <connectionString value="data source=ysg;initial catalog=DBGA_DEV;integrated security=true;persist security info=True;" />
      <commandText value="INSERT INTO [DBGA_DEV].[ga].[tb_Data_Log] ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />

      <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.PatternLayout" value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
      </parameter>
      <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout" value="%thread" />
      </parameter>
      <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout" value="%level" />
      </parameter>
      <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout" value="%logger" />
      </parameter>
      <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout" value="%messag2e" />
      </parameter>
    </appender>
    <root>
      <level value="INFO" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="AdoNetAppender" />
      <appender-ref ref="ColoredConsoleAppender" />
    </root>
  </log4net>
</configuration>
 */
#endregion TheAppconfig

#region TheXmlReferingToTheNUnitAndLog4NetInNUnitSimple.csprojFile
/*
     <Reference Include="log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\..\..\Log4Net\log4net-1.2.10\bin\net\2.0\release\log4net.dll</HintPath>
    </Reference>
    <Reference Include="nunit.framework, Version=2.4.8.0, Culture=neutral, PublicKeyToken=96d09a1eb7f44a77, processorArchitecture=MSIL" />
 */
#endregion

【问题讨论】:

  • 您介意我们将缩进改为 4 而不是 8 吗?目前阅读代码有点困难。

标签: c# unit-testing logging nunit log4net


【解决方案1】:

与其建立一个项目然后剪切和粘贴,不如看看像Tree Surgeon这样的脚本工具来建立一个项目结构。这将设置您的解决方案、项目和项目文件夹。它包括 nUnit 和 nAnt 的功能。

请务必查看项目主页底部镜像的博客文章。

顺便说一句:我同意 Jon Skeet 对控制台应用程序的看法。它们可能很有用,但如果您有类似 TestDriven.Net 之类的用于 VS.2005 及更早版本的工具,或 VS.2008 测试工具,则无需创建自己的工具应用程序即可进入您的测试代码。

【讨论】:

  • 它有效而且比我聪明!!! ; )必须玩一会儿...并添加log4net调试...
【解决方案2】:

我真的不明白在现有项目中包含新类、在现有测试项目中包含新测试类并在那里运行测试有什么好处。

为什么要引入控制台应用程序?您真的需要从控制台应用程序而不是现有的测试运行器之一运行测试吗? (不要误会我的意思,我是控制台应用程序的忠实粉丝 - 我只是看不出它们如何适合这里。)

【讨论】:

  • 好处是复杂性管理。在大项目中的 100 000 行代码之后,即使是简单的实用程序类也可能会干扰某些东西,即使它是根据单一职责的最佳实践等设计的。我目前正在开发 Web 应用程序,当前项目的代码库很大(至少为了我: )。所以目的是稍后创建简单的 Web 应用程序......
  • 听起来主项目需要重构为包。非常重要,因为它可以让您更简单地进行单元测试。
  • 如果添加一个不引用其他任何内容的新类会破坏您的项目,我会说您遇到的问题比单元测试更大。
猜你喜欢
  • 2013-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-11
  • 2010-10-24
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
相关资源
最近更新 更多