2017-10-17 9 views
1

私はAPIの複数のバージョンを持ついくつかのソフトウェアにAPI用のラッパーライブラリを作成しています。同時に複数のプラットフォーム間で多数の共有呼び出しが同時に作成されています。時間がたつにつれて、同じコードベースを使用するプラットフォームを、異なる名前空間& * .exeビルドのまさにマージしています。NUnitとNCrunchを使用してプリプロセッサディレクティブで複数のビルド構成をテストできますか?

私は、単一のコードベースを作成し、プリプロセッサディレクティブと条件付きコンパイルシンボルを使用してビルド設定を行い、ビルドに特定のコードを選択的に使用することでこれを行います。コードの約90%は、バージョンとプラットフォームの間で文字通り再利用できるため、参考になります。テスト中のプロジェクトではすべて正常に動作します。

しかし、NUnit & NCrunchのユニットテストに問題があります。正しい定数をロードし、統合テストプロジェクトの正しいビルドフォルダを作成するために、同じビルド構成を作成しました。

  1. NUnitのは、統合テストプロジェクトのプリプロセッサ命令を無視しているように見える。しかし、私は2つの奇妙な問題に気付いています。たとえば、次の例では、Visual Studioでは目的の行セット(現在の構成変数に対応)が表示されていても、構成に関係なく(BUILD_Bar_2015 = trueなど)、最初の行のコードが常にヒットします(BUILD_Foov16 = true) )アクティブな唯一のものです:

    [TestFixture] 
    public class FooBarIncApplicationTests 
    { 
        #if BUILD_Foov16 
         public const string path = @"C:\Program Files (x86)\FooBarInc\FooV16\Foo.exe"; 
        #elif BUILD_Foov17 
         public const string path = @"C:\Program Files (x86)\FooBarInc\FooV17\Foo.exe"; 
        #elif BUILD_Bar_2013 
         public const string path = @"C:\Program Files (x86)\FooBarInc\Bar 2013\Bar.exe"; 
        #elif BUILD_Bar_2015 
         public const string path = @"C:\Program Files (x86)\FooBarInc\Bar 2015\Bar.exe"; 
        #endif 
    
        [Test] 
        public void FooBarIncApplication_Initialize_New_Instance_Defaults() 
        { 
         using (FooBarIncApplication app = new FooBarIncApplication(path)) 
         { 
         ... 
         } 
        } 
    } 
    
  2. さらに、私がNCrunchてテストを実行すると、それだけで(例えばそれが記載されている第一の構成で作成されたビルドに対応する* .dllファイルを使用しているようですFoo.exe v16用にコンパイルされた* .dllを常にテストしてください。

これらの2つの問題ar電子関連。私はNUnitやNCrunchがそのような設定を処理できないのだろうか、あるいはこの独特な設定を扱うべきである特定の方法があるかどうか疑問に思っていますか?

私の大きな問題は#2です。これは、NCrunchが最初の設定から構築された* .dllだけでNUnitを実行しているように見えるため、他の設定をテストすることができません。おそらく、これはプロジェクトの依存関係に問題がありますか? (上の例のパスは、私がAPIを介してやりとりしているプログラムですが、私の* .dllプロジェクトではありません)

答えて

1

[OK]をクリックすると、問題の原因がわかりました。これは、複数のDLLビルド構成に対してNCrunchをテストしているかどうかを知る価値があります。

NCrunchが実行されると、* .dllが生成され、コードカバレッジが確認され(そしてステップスルーされても)、Visual Studioで指定された現在の設定の影響を受けません。 Visual Studioがプロジェクトを読み込むときのプロジェクトのデフォルト設定によって常に決定されます。つまり、テスト用の設定を変更するには、* .csprojファイルを変更する必要があります。

たとえば、以下に示すFoov16とFoov17の構成定義があります。 NCrunchが動作するようにFoov17にプロジェクトを設定するためには、Foov17のための設定がデフォルトの設定(最初の要素)で参照する必要があります。

<PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug-Foov17</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
    <ProjectGuid>{...}</ProjectGuid> 
    <OutputType>Library</OutputType> 
    <AppDesignerFolder>Properties</AppDesignerFolder> 
    <RootNamespace>FooBarInc.API</RootNamespace> 
    <AssemblyName>FooBarInc.API</AssemblyName> 
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion> 
    <FileAlignment>512</FileAlignment> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug-Foov16|AnyCPU'"> 
    <DebugSymbols>true</DebugSymbols> 
    <OutputPath>bin\AnyCPU\Debug-Foov16\</OutputPath> 
    <DefineConstants>TRACE;DEBUG;BUILD_Foov16</DefineConstants> 
    <DebugType>full</DebugType> 
    <PlatformTarget>AnyCPU</PlatformTarget> 
    <ErrorReport>prompt</ErrorReport> 
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> 
    <DocumentationFile>bin\AnyCPU\Debug-Foov16\FooBarInc.API.XML</DocumentationFile> 
</PropertyGroup> 
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Debug-Foov17|AnyCPU'"> 
    <DebugSymbols>true</DebugSymbols> 
    <OutputPath>bin\AnyCPU\Debug-Foov17\</OutputPath> 
    <DefineConstants>TRACE;DEBUG;BUILD_Foov17</DefineConstants> 
    <DebugType>full</DebugType> 
    <PlatformTarget>AnyCPU</PlatformTarget> 
    <ErrorReport>prompt</ErrorReport 
    <CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet> 
    <DocumentationFile>bin\AnyCPU\Debug-Foov17\FooBarInc.API.XML</DocumentationFile> 
</PropertyGroup> 
0

それが役立つかどうかはわかりません。私が正しく理解していれば、テストケースに異なるexeパスを注入し、すべてのexeパスに対してテストケースを実行させたいと考えています。これにはNUnitsTestCase属性を使用できます。 NUnitのウェブサイトからの例:

あなたがあなたのテストを書き換えることに基づいて
[TestCase(12,3,4)] 
    [TestCase(12,2,6)] 
    [TestCase(12,4,3)] 
    public void DivideTest(int n, int d, int q) 
    { 
    Assert.AreEqual(q, n/d); 
    } 

:テストケースは、バージョン16とバージョン、あなたのexeファイルの17で実行されますことを

[TestCase(@"C:\Program Files (x86)\FooBarInc\FooV16\Foo.exe")] 
[TestCase(@"C:\Program Files (x86)\FooBarInc\FooV17\Foo.exe")] 
public void FooBarIncApplication_Initialize_New_Instance_Defaults(string path) 
{ 
    using (FooBarIncApplicatio app = new FooBarIncApplicatio(path)) 
    { 
    ... 
    } 
} 

ベースに。追加の利点:すべてのテストを実行するためにVS設定を切り替える必要はありません。

条件付きテストケースの実行を依然として使用する場合は、CategoryまたはSystem.Diagnostics.Conditional属性を使用できます。詳細については、stackoverflow linkを参照してください。

希望に役立ちます。

+0

たぶんソリューションは、そこに見つけることができます。私の大きな問題は#2です。これは、NCrunchが最初の設定から構築された* .dllだけでNUnitを実行しているように見えるため、他の設定をテストすることが不可能になります。おそらく、これはプロジェクトの依存関係に問題がありますか?上記の例のパスは、私がAPIを介してやり取りしているプログラムであり、私の* .dllプロジェクトではありません。 – PellucidWombat

関連する問題