[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 メーリングリストの案内