C# 如何创建一个简单的示例控制台应用程序,用于为测试驱动的开发开发开发单独的类?
我的目的是创建一个简单、易于调试的控制台应用程序,它将成为C#中测试驱动开发单个类的模板(或起点)。其目的是在控制台应用程序所在的地方有一个简单的文件夹,只需复制粘贴该文件夹即可打开新项目并开始编写新类。一旦类测试了所有功能(最好测试应该在同一个文件(或至少是命名空间)中),该类将被允许进入更大的项目。我正在使用NUnit和log4net。如果你这样做的话,你可以使用这种“小型测试驱动单元构建”方法你是如何实现它的。请发布一些代码或解释。如果你不使用,请解释为什么? 下面是代码(配置数据也粘贴为注释…)C# 如何创建一个简单的示例控制台应用程序,用于为测试驱动的开发开发开发单独的类?,c#,unit-testing,logging,nunit,log4net,C#,Unit Testing,Logging,Nunit,Log4net,我的目的是创建一个简单、易于调试的控制台应用程序,它将成为C#中测试驱动开发单个类的模板(或起点)。其目的是在控制台应用程序所在的地方有一个简单的文件夹,只需复制粘贴该文件夹即可打开新项目并开始编写新类。一旦类测试了所有功能(最好测试应该在同一个文件(或至少是命名空间)中),该类将被允许进入更大的项目。我正在使用NUnit和log4net。如果你这样做的话,你可以使用这种“小型测试驱动单元构建”方法你是如何实现它的。请发布一些代码或解释。如果你不使用,请解释为什么? 下面是代码(配置数据也粘贴为
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用log4net;
使用log4net.Config;
使用NUnit.Framework;
名称空间不简单
{
将ClassToTest_减法器分类
{
专用静态只读ILog记录器=
LogManager.GetLogger(typeof(classtotest_Substractor));
公共静态无效减法(int intToSusbractFrom,int intToSubstract,ref int intTheResult)
{
intTheResult=intToSusbractFrom-intToSubstract;
}
静态void Main(字符串[]参数)
{
DOMConfigurator.Configure();//配置记录器
logger.Info(“开始”);
Info(“按一个键退出”);
Console.ReadLine();
}//eof方法
}//eof类
[TestFixture]//告诉NUnit此类包含测试函数
公共类测试ClassToTest\u减法器
{
[Test]//告诉NUnit应该在测试期间运行此函数
public void TestSubstractOk()
{
int intToSusbractFrom=10;
int intToSubstract=4;
int intTheResult=0;
ClassToTest_Substractor.Substract(intToSusbractFrom,intToSubstract,ref intTheResult);
Assert.AreEqual(6,intTheResult);
}
[Test]//告诉NUnit应该在测试期间运行此函数
公共无效测试substractnok()
{
int intToSusbractFrom=10;
int intToSubstract=4;
int intTheResult=0;
ClassToTest_Substractor.Substract(intToSusbractFrom,intToSubstract,ref intTheResult);
Assert.AreNotEqual(3,intTheResult);
}
}//eof类
}//eof名称空间
#区域应用配置
/*
*/
#endregion应用程序配置
#区域XmlReferencenthenUnitandLog4NetInUnitSimple.csprojFile
/*
假的
..\..\..\Log4Net\Log4Net-1.2.10\bin\net\2.0\release\Log4Net.dll
*/
#端区
在现有项目中包含新类,在现有测试项目中包含新测试类,并在那里运行测试,我真的看不出有什么好处
为什么要引入控制台应用程序?你真的需要从控制台应用程序而不是从现有的测试运行程序中运行测试吗?(别误会,我是控制台应用程序的忠实粉丝-我只是不知道它们如何适合这里。)与其先设置项目,然后剪切粘贴,不如使用脚本工具来设置项目结构。这将设置解决方案、项目和项目文件夹。它包括nUnit和nAnt的功能 请务必查看反映在项目主页底部的博客文章
顺便说一句:我同意Jon Skeet关于控制台应用程序的观点。它们可能很有用,但是如果你有一个像VS.2005和更早版本的工具,或者VS.2008测试工具,你可以在不创建自己的应用程序的情况下进入测试代码。你介意我们将缩进改为4而不是8吗?目前阅读代码有点困难。好处是复杂度管理。在大型项目中,经过100000行代码之后,即使是简单的实用程序类也可能会干扰某些东西,即使它是根据单一责任的最佳实践设计的。我目前正在开发web应用程序,当前项目的代码库非常庞大(至少对我来说:)。因此,目的是在以后创建简单的Web应用程序……听起来主项目需要重构为包。非常重要,因为它可以让您更简单地进行单元测试。如果添加一个不引用任何其他内容的新类会破坏您的项目,我会说您的问题比单元测试更大。这很有效它比我聪明!!!;)我得玩一会儿。。。并添加log4net调试也。。。
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