テスト駆動開発用の個別のクラスを開発するための簡単なサンプルコンソールアプリケーションの作成方法
-
03-07-2019 - |
質問
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
解決
プロジェクトを設定してからカットアンドペーストするのではなく、ツリーサージョンプロジェクト構造を設定します。これにより、ソリューション、プロジェクト、およびプロジェクトフォルダーが設定されます。 nUnitとnAntの両方の機能が含まれています。
プロジェクトのホームページの下部にミラーリングされているブログ投稿を確認してください。
ところで:コンソールアプリのJon Skeetに同意します。これらは便利ですが、VS.2005以前の TestDriven.Net などのツールがある場合、またはVS.2008テストツールを使用すると、独自のハーネスアプリを作成せずにテストコードにステップインできます。
他のヒント
既存のプロジェクトに新しいクラスを含め、既存のテストプロジェクトに新しいテストクラスを含め、そこでテストを実行することの利点は実際にはわかりません。
コンソールアプリを導入する理由既存のテストランナーからではなく、コンソールアプリからテストを実行する必要が本当にありますか? (誤解しないでください、私はコンソールアプリの大ファンです-ここにどのように収まるかわかりません。)