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

kubo [E-MAIL ADDRESS DELETED]
2009年 9月 28日 (月) 13:33:40 JST


久保(jflute)です。

早川さん、こんにちは
この投稿自体が情報共有になってとてもうれしいです。
ぜひMLをご覧の皆様、カバレッジ取得のツールについて
なにか情報あれば気軽に投稿して頂ければと思います。

#
# JScriptに関しては、コミッタの方でどなたか詳しい方
# いらっしゃいます???
#

2009/9/26 早川貴彦 <[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
>


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