2009-05-01 8 views
0

私は、C#でテスト駆動型の単一クラスを開発するためのテンプレート(または出発点)となる簡単にデバッグ可能なコンソールアプリケーションを作成する予定です。目的は、このコンソールアプリケーションが常駐するシンプルなフォルダを持ち、フォルダをコピーして新しいプロジェクトを開いて新しいクラスを書き始めることです。クラスがすべての機能をテストするとすぐに(テストは同じファイル(または少なくとも名前空間)にすることをお勧めします)、NUnitと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 
+0

インデントを8ではなく4に変更してもよろしいですか?現時点でコードを読むのはちょっと難しいです。 –

答えて

2

プロジェクトを設定し、 Tree Surgeonのようなスクリプトツールでプロジェクト構造を設定します。これにより、ソリューション、プロジェクト、プロジェクトフォルダが設定されます。これには、nUnitとnAntの両方の機能が含まれています。

プロジェクトのホームページの下部にミラーリングされているブログの投稿を必ず確認してください。

BTW:私はコンソールアプリのJon Skeetに同意します。 VS.2005以前のツールやVS.2008テストツールのようなツールがある場合は、独自のハーネスアプリケーションを作成せずにテストコードにステップインすることができます。

+0

それは動作し、それは私よりスマートです! ; ) しばらくそれを再生する必要があります...また、log4netのデバッグを追加... –

1

私は本当にメリットがオーバー、既存のプロジェクトで新しいクラスを含め、既存のテストプロジェクトにおける新たなテストクラスを含めて、そこにテストを実行しているものが表示されません。

なぜコンソールアプリケーションを導入するのですか?あなたは本当に既存のテストランナーの1人ではなく、コンソールアプリケーションからテストを実行する必要がありますか? (私は間違ってはいませんが、私はコンソールアプリケーションの大ファンです - 私はちょうど彼らがここに収まる方法を見ていません)

+0

利点は複雑さの管理です。大きなプロジェクトで100,000行ものコードが単純なユーティリティクラスであっても、単一責任などのベストプラクティスに従って設計されていても、何かを妨害する可能性があります。 現在、私は現在Webアプリケーションで作業していますが、現在のプロジェクトのコードベースは少なくとも私のために)。したがって、後で簡単なWebアプリケーションを作成することも目的です。 –

+1

メインプロジェクトのようなサウンドは、パッケージにリファクタリングする必要があります。非常に重要なことは、ユニットテストをはるかに簡単に行うことができるからです。 –

+0

他に何も参照しない新しいクラスを追加するとプロジェクトが壊れる場合は、単体テストよりも大きな問題があると言えます。 –

関連する問題