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

[E-MAIL ADDRESS DELETED] [E-MAIL ADDRESS DELETED]
2009年 9月 28日 (月) 14:46:26 JST


菊池です

#個人宛に送ってしまったので再送

アセンブリの参照解決で問題が発生しているように見えますね。

http://msdn.microsoft.com/ja-jp/library/e74a18c4(VS.80).aspx
fuslogvw.exe

でのアセンブリバインディングで実際の参照関係とエラーの詳細の確認と

http://msdn.microsoft.com/ja-jp/library/yx7xezcf(VS.80).aspx
ランタイムがアセンブリを検索する方法

と

http://msdn.microsoft.com/ja-jp/library/efs781xb(VS.80).aspx
<codeBase> 要素

を参照して参照解決に失敗したアセンブリを app.config で明示的にcodeBase指定し 
てみてください。
(またはアセンブリのある場所を pobing対象にしてください)

関連チェックポイント
・GAC前提となっているアセンブリが正しくGAC登録されているか
・コンパイル時と実行時でバージョンの異なるアセンブリを利用していないか

この辺も確認してみてください。

2009/09/26 8:10 早川貴彦 <[E-MAIL ADDRESS DELETED]>:
> いつもお世話になっております。早川と申します。


> 件名の件で困っておりまして、何らかの回避方法を、


> または、カバレッジ取得に皆様はどんなツール(フリー・商用)を使用されているか


> 教えていただければと思いメールしました。





> [現象]


> 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 mailing list


> [E-MAIL ADDRESS DELETED]


> https://ml.seasar.org/mailman/listinfo/seasar-dotnet



-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20090928/0fd3c634/attachment.html>


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