[seasar-dotnet:1031] Re: QuillTestCaseのトランザクションについて

k.moriwaki [E-MAIL ADDRESS DELETED]
2008年 10月 21日 (火) 18:49:23 JST


久保さn
森脇です、回答ありがとうございます。

> 1.「SelectEntityのテストを実行後、Insertのテストを実行すると」
> でしょうか?それとも、
> 2.「同じテストメソッド内で、SelectEntity()してInsert()すると」
> でしょうか?
ご推測のとおり1です。

> 試しにOracle純正のDataProviderを利用してみるのもいいかも
> しれません。
本日はもう帰宅してしまいましたので明日試してみます。


# 個人的にはすごく単純なチョンボのような気がしないでもないですが、
# dbflute-nbasic-exampleとの違いがDBくらいしか無い(と思っている)
# ので何が原因なのかさっぱりな感じです。

2008/10/21 18:29 kubo <[E-MAIL ADDRESS DELETED]>:
> 久保(jflute)です。
>
> 森脇さん、こんばんは
>
> 詳しい人が多分夏休みでしばらくいないので
> 取り急ぎ回答します。
>
>> 動きで気になる点としては以下のような感じです。
>>    a.Insertを初回に実行するとロールバックされる
>>    b.SelectEntityを実行後にInsertが実行されるとロールバックしない
>
> 確認ですが「SelectEntityを実行後にInsertが実行されると」
> というのは、
>
> 1.「SelectEntityのテストを実行後、Insertのテストを実行すると」
>
> でしょうか?それとも、
>
> 2.「同じテストメソッド内で、SelectEntity()してInsert()すると」
>
> でしょうか?
> ソースコードから前者だと思われますが。。。
>
> ちなみに、dbflute-noracle-exampleというのも存在していて、
> そちらで上記の「1」と「2」を両方ともやってみましたが、
> 再現しませんでした。(別のツールでDBを検索して確認しました)
>
> 設定の違いは、ぱっと見た限りはDataProviderが
> MS提供のものかOracle純正のものかだけのように思えます。
> 試しにOracle純正のDataProviderを利用してみるのもいいかも
> しれません。
> (OracleClientのインストールとかちょっと環境整えるの
>  面倒かもしれませんが。。。)
>
> 2008/10/21 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>> 森脇と申します。
>>
>> DBFluteのサンプルソース(dbflute-nbasic-example)と同じような
>> Bhvのテストケースを作成し、MbUnitで実行したのですがトランザクションが
>> ロールバックされない現象が起きました。
>>
>> MbUnitのGUIに表示されているログは「ロールバックされました」と表示されているのですが、
>> 実際にはDBにInsertされており、二回目以降でPK重複エラーになってしまいます。
>> 動きで気になる点としては以下のような感じです。
>>    a.Insertを初回に実行するとロールバックされる
>>    b.SelectEntityを実行後にInsertが実行されるとロールバックしない
>> dbflute-nbasic-exampleに同梱されていたMbUnitを使用しており、
>> そちらのテストケースはすべて成功します。
>>
>> 以下に挙げる設定で何か不足している点などありますでしょうか?
>>
>>
>>
>> 環境
>> OS:Windows XP SP3
>> 言語:VB(.NET Framework2.0)
>> 開発環境:VisualStudio 2005
>> DB:Oracle 10.1.0.2.0
>> S2Container.NET,S2Dao.NET:1.3.12
>> DBFlute 0.8.1
>>
>>
>> ----- MbUnitのログ -----
>>    INFO  (Logger#Info():0) - [IQLL0003]Quill設定ファイル(ある=true,なし=false):True
>>    DEBUG (Logger#Log():0) - 論理的なコネクションを取得しました
>>    DEBUG (Logger#Log():0) - トランザクションを開始しました
>>    DEBUG (S2DaoMetaDataFactoryImpl#GetDaoMetaData():68) - ...Creating
>> daoMetaData for 'CodeMstDao'.
>>    DEBUG (S2DaoMetaDataExtension#GetSqlCommand():76) -
>> ...Initializing sqlCommand for Insert().
>>    DEBUG (XLog#Log():21) -
>> /========================================================================
>>    DEBUG (XLog#Log():21) -
>>           CodeMstBhv.Insert()
>>    DEBUG (XLog#Log():21) -
>>           ==================/
>>    DEBUG (QLog#Log():22) - INSERT INTO CODE_MST (NAME, CODE,
>> VERSION_NO) VALUES ('テスト', '999', 0)
>>    DEBUG (XLog#Log():21) - ===========/ [00m00s016ms - Result: 1]
>>    DEBUG (XLog#Log():21) -
>>    DEBUG (Logger#Log():0) - トランザクションをロールバックしました
>>    DEBUG (Logger#Log():0) - 論理的なコネクションを閉じました
>>
>>
>> ----- App.config -----
>>    <?xml version="1.0" encoding="utf-8" ?>
>>    <configuration>
>>
>>      <configSections>
>>        <section name="log4net"
>> type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
>>        <section name="quill"
>> type="Seasar.Quill.Xml.QuillSectionHandler, Seasar.Quill"/>
>>      </configSections>
>>
>>      <quill>
>>        <dataSources>
>>          <dataSource name="KankyoDB">
>>            <provider>Oracle</provider>
>>            <connectionString>"Data Source=hogedb;User
>> Id=hoge;Password=hoge;"</connectionString>
>>            <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
>>          </dataSource>
>>        </dataSources>
>>        <assemblys>
>>          <assembly>System.Data.OracleClient, version=2.0.0.0,
>> Culture=neutral, PublicKeyToken=b77a5c561934e089</assembly>
>>        </assemblys>
>>      </quill>
>>
>>      <log4net>
>>        <appender name="DebugLogFileAppender"
>> type="log4net.Appender.RollingFileAppender">
>>          <file value="C:\tmp\log\dbflute-nbasic-example-debug.log"/>
>>          <appendToFile value="true"/>
>>          <rollingStyle value="Date"/>
>>          <datePattern value="yyyyMMdd"/>
>>          <layout type="log4net.Layout.PatternLayout">
>>            <conversionPattern value="%date [%t] %-5level
>> (%C{1}#%M():%L) - %m%n"/>
>>          </layout>
>>        </appender>
>>        <appender name="DebugConsoleAppender"
>> type="log4net.Appender.ConsoleAppender">
>>          <layout type="log4net.Layout.PatternLayout">
>>            <conversionPattern value="%-5level (%C{1}#%M():%L) - %m%n"/>
>>          </layout>
>>        </appender>
>>        <root>
>>          <level value="DEBUG" />
>>          <appender-ref ref="DebugConsoleAppender"/>
>>        </root>
>>      </log4net>
>>
>>    </configuration>
>>
>>
>> ----- App.config -----
>>    namespace App.DB.Example.DBFlute
>>    {
>>        [TestFixture]
>>        public class BehaviorTest : QuillTestCase
>>        {
>>            /// <summary>
>>            /// Log
>>            /// </summary>
>>            private static readonly log4net.ILog m_log =
>>
>> log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
>>
>>            /// <summary>
>>            /// BehaviorSelector
>>            /// </summary>
>>            protected BehaviorSelector m_Selector;
>>
>>            /// <summary>
>>            /// Setup
>>            /// </summary>
>>            [MbUnit.Framework.SetUp]
>>            public void Before()
>>            {
>>                log4net.Config.XmlConfigurator.Configure();
>>
>>                AccessContext context = new AccessContext();
>>                context.AccessTimestamp = DateTime.Now;
>>                context.AccessUser = "testUser";
>>                context.AccessProcess = "testProcess";
>>                AccessContext.SetAccessContextOnThread(context);
>>            }
>>
>>            /// <summary>
>>            /// TearDown
>>            /// </summary>
>>            [MbUnit.Framework.TearDown]
>>            public void After()
>>            {
>>                AccessContext.ClearAccessContextOnThread();
>>            }
>>
>>            /// <summary>
>>            /// selectEntity
>>            /// </summary>
>>            [Test, Quill(Tx.Rollback)]
>>            public void SelectEntity()
>>            {
>>                // ## Arrange ##
>>                CodeMstCB cb = new CodeMstCB();
>>                cb.Query().SetCode_Equal("01");
>>
>>                // ## Act ##
>>                CodeMstBhv bhv = m_Selector.Select<CodeMstBhv>();
>>                CodeMst code = bhv.SelectEntity(cb);
>>
>>                // ## Assert ##
>>                m_log.Debug(code.ToString());
>>                Assert.AreEqual("01", code.Code);
>>            }
>>
>>            /// <summary>
>>            /// Insert
>>            /// </summary>
>>            [Test, Quill(Tx.Rollback)]
>>            public void Insert()
>>            {
>>                // ## Arrange ##
>>                CodeMst code = new CodeMst();
>>                code.Code = "999";
>>                code.Name = "テスト";
>>
>>                // ## Act ##
>>                CodeMstBhv bhv = m_Selector.Select<CodeMstBhv>();
>>                bhv.Insert(code);
>>            }
>>
>>        }
>>    }
>> _______________________________________________
>> seasar-dotnet mailing list
>> [E-MAIL ADDRESS DELETED]
>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>>
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>


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