[seasar-dotnet:1491] PartCover Nunit S2Container.netでカバレッジが取得できない(例外が発生する)

早川貴彦 [E-MAIL ADDRESS DELETED]
2009年 9月 26日 (土) 08:10:36 JST


いつもお世話になっております。早川と申します。
件名の件で困っておりまして、何らかの回避方法を、
または、カバレッジ取得に皆様はどんなツール(フリー・商用)を使用されているか
教えていただければと思いメールしました。

[現象]
PartCoverからNunitを起動してテスト内容のカバレッジを取得しようとすると、
Seasarの初期化処理にてエラーが発生してしまう。


[前提]
 1 コンソールアプリ(以下アプリ)            OK
 2 Nunit→テストdll→アプリ                 OK
 3 PartCover→アプリ                         OK
 4 PartCover→Nunit→テストdll→アプリ 例外発生
  補足:4のテストdllにてSeasarの初期化処理を行わないテストの場合は
     エラーは発生しない

[例外]
 Nunitのコンソールに出力された例外情報は以下の通りです。
 (但しパス内のOSログインユーザ名のみ編集)
 JScriptUtilにて、Tempディレクトリにdllを探しに行ってしまい、
 エラーが発生しています。
 (ここで探しているdllは、実行毎に毎回名称が変わる
  →JScript.netによりdicon記述内容を評価するために使用しているもののようだ)

Seasar.WindowsExample.Tests.TestClass1.testMethod:
System.TypeInitializationException :
'Seasar.Framework.Util.JScriptUtil' のタイプ初期化子が例外をスローしました。
  ----> System.IO.FileNotFoundException : ファイルまたはアセンブリ
'file:///C:\Documents and Settings\ユーザ名\Local Settings\Temp\c_1pjiaw.dll'、
またはその依存関係の 1 つが読み込めませんでした。指定されたファイルが見つかりません。

場所 Seasar.Framework.Util.JScriptUtil.Evaluate(String exp, Object root)
場所 Seasar.Framework.Container.Impl.ArgDefImpl.get_Value()
場所 Seasar.Framework.Container.Assembler.AbstractPropertyAssembler.GetValue(IPropertyDef
propertyDef, Object component)
場所 Seasar.Framework.Container.Assembler.AutoPropertyAssembler.Assemble(Object
component)
場所 Seasar.Framework.Container.Deployer.SingletonComponentDeployer.Assemble()
場所 Seasar.Framework.Container.Deployer.SingletonComponentDeployer.Deploy(Type
receiveType)
場所 Seasar.Framework.Container.Deployer.SingletonComponentDeployer.Init()
場所 Seasar.Framework.Container.Impl.ComponentDefImpl.Init()
場所 Seasar.Framework.Container.Impl.S2ContainerImpl.Init()
場所 Seasar.Framework.Container.Impl.S2ContainerImpl.Init()
場所 Seasar.Framework.Container.Factory.SingletonS2ContainerFactory.Init()
場所 Seasar.WindowsExample.Tests.TestClass1.Setup() 場所 C:\Documents and
Settings\ユーザ名\My Documents\Visual Studio
2008\Projects\sample\S2WindowsExample.Tests\TestClass1.cs:行 29
--FileNotFoundException
場所 System.Reflection.Assembly._nLoad(AssemblyName fileName, String
codeBase, Evidence assemblySecurity, Assembly locationHint,
StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean
forIntrospection)
場所 System.Reflection.Assembly.nLoad(AssemblyName fileName, String
codeBase, Evidence assemblySecurity, Assembly locationHint,
StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean
forIntrospection)
場所 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,
Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean
forIntrospection)
場所 System.Reflection.Assembly.Load(AssemblyName assemblyRef, Evidence
assemblySecurity)
場所 System.CodeDom.Compiler.CompilerResults.get_CompiledAssembly()
場所 Seasar.Framework.Util.JScriptUtil..cctor()

[使用Framework]
 S2Container.net   1.3.9 (再現方法ではこのバージョンを用いましたが、1.3.14でも同様でした)
 S2Dao.net           1.3.9
 Nunit                   2.5.1.9189
 PartCover            2.3.0.35109

[再現方法]
1 http://s2container.net.seasar.org/download/windowsformsample-1.3.9.zip
 のS2WindowsExample.Testsプロジェクトに、参照設定でNunit.framework.dllを追加
2 上記プロジェクトに下記テストクラスを追加
3  http://blog.goo.ne.jp/wildriver_1977/e/f6a608cb164b4355bd55423410b20ec7
   を参考にしてPartCoverからNunitを実行し、テストアプリを実行

 2のテストクラス
using System;
using System.Collections.Generic;
using System.Text;
using NUnit.Framework;
using System.IO;
using log4net.Util;
using System.Reflection;
using log4net;
using log4net.Config;
using Seasar.Framework.Container.Factory;
namespace Seasar.WindowsExample.Tests
{

    [TestFixture]
    public class TestClass1
    {
        [SetUp]
        public void Setup()
        {
            FileInfo info = new FileInfo(string.Format("{0}.dll.config",
                SystemInfo.AssemblyShortName(Assembly.GetExecutingAssembly())));
            XmlConfigurator.Configure(LogManager.GetRepository(), info);

            SingletonS2ContainerFactory.ConfigPath = "ExampleLogics.dicon";
            SingletonS2ContainerFactory.Init();
        }
        [Test]
        public void testMethod()
        {
            //Seasarの初期化処理でエラーが発生しなかったかどうかを確認するためだけのテスト
            Assert.IsTrue(true);
        }
        [TearDown]
        public void TearDown()
        {
            SingletonS2ContainerFactory.Destroy();
        }
    }
}


[疑問点]
Seasar.Framework.Util.JScriptUtilではparameters.GenerateInMemory = true;
となっており、正常動作するパターンの場合にはメモリ上にdllが作成されているようだが
PartCover→Nunit→テストdllの場合には例外記載のパスを探しに行ってしまう点
(exe     →exe →dllの場合?それとも他に何か条件がある?)



[試行内容]
・PartCover/Nunitはそれぞれコンソールアプリ、GUIアプリがあり、
 それぞれの組み合わせ(4通り)を試しても同様の現象

・nunitの設定にて
 /domain   None,Single,Multiple 3通り
 /process Single,Separate,Multiple 3通り
 /noshadow 2通り
 /nothread 2通り
 の組み合わせを試してみても問題の解決には繋がらず

・PartCover側には上記のような動作に影響のあるようなオプションは無い
 →こちらで/noshadowのようなオプション動作が必要なのでは?と
  想像しつつも不明


以上です
どうぞよろしくお願いします


-- 
早川貴彦


seasar-dotnet メーリングリストの案内