سؤال

ما هو تكوين الربيع الخاص بك للاختبارات التكامل تبدو وكأنها باستخدام مدمجة H2 DataSource. و، اختياريا، جونيت؟

جرب بلدي الأول مع singleconnectiondatasource. عملت أساسا، لكنها فشلت في اختبارات أكثر تعقيدا حيث تحتاج إلى العديد من الاتصالات في نفس الوقت أو المعاملات المعلقة. أعتقد H2 في وضع الخادم المستند إلى TCP قد تعمل كذلك، ولكن هذا ليس من المحتمل أن لا يكون وضع اتصال أسرع لقاعدة بيانات مضمنة مؤقتة في الذاكرة.

ما هي الاحتمالات ومزاياها / عيوبها؟ أيضا، كيف يمكنك إنشاء الجداول / ملء قاعدة البيانات؟


تحديث: دعونا حدد بعض المتطلبات الملموسة المهمة لهذه الاختبارات.

  • يجب أن تكون قاعدة البيانات مؤقتة وفي الذاكرة
  • ربما لا ينبغي أن يستخدم الاتصال TCP، لمتطلبات السرعة
  • سيكون من الرائع أن أستخدم أداة قاعدة بيانات لفحص محتوى قاعدة البيانات أثناء تصحيح الأخطاء
  • علينا تحديد DataSource لأنه لا يمكننا استخدام مخزونات التطبيق DataSource في اختبارات الوحدة
هل كانت مفيدة؟

المحلول

مع التحفظ الذي لا أعرفه إذا كان هناك أي أداة يمكن أن تفقد قاعدة البيانات، أعتقد أن الحل البسيط سيكون استخدام قاعدة بيانات الربيع المضمنة (3.1.x docs., مستندات حالية) الذي يدعم HSQL و H2 و Derby.

باستخدام H2، فإن تكوين XML الخاص بك سيبدو وكأنه ما يلي:

<jdbc:embedded-database id="dataSource" type="H2">
    <jdbc:script location="classpath:db-schema.sql"/>
    <jdbc:script location="classpath:db-test-data.sql"/>
</jdbc:embedded-database>

إذا كنت تفضل التكوين القائم على Java، فيمكنك إنشاء مثيل DataSource مثل هذا (لاحظ ذلك EmbeddedDataBase يمتد DataSource):

@Bean(destroyMethod = "shutdown")
public EmbeddedDatabase dataSource() {
    return new EmbeddedDatabaseBuilder().
            setType(EmbeddedDatabaseType.H2).
            addScript("db-schema.sql").
            addScript("db-test-data.sql").
            build();
}

يتم إنشاء جداول قاعدة البيانات من قبل DB-Schema.sql. البرنامج النصي ويتم ملؤها مع بيانات الاختبار من DB-TEST-DATA.SQL النصي.

لا تنس إضافة برنامج تشغيل قاعدة بيانات H2 إلى ClassPath الخاص بك.

نصائح أخرى

أنا حاليا تتضمن حاليا في ملف SpringConfig فقط كملفات مصدر بيانات:

<bean id="database.dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <constructor-arg>
        <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
            <property name="driverClass" value="org.h2.Driver" />
            <property name="url"
                value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2" />
        </bean>
    </constructor-arg>
</bean>

<!-- provides a H2 console to look into the db if necessary -->
<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" 
    factory-method="createWebServer" depends-on="database.dataSource" 
    init-method="start" lazy-init="false">
    <constructor-arg value="-web,-webPort,11111" />
</bean>

يمكن إجراء إنشاء / إسقاط الجداول باستخدام ExecutesQLScript عند تجاوز التزلج على التجريبية, ، أو مع simplejdbctustutils.executesqlscript. في مكان مناسب.

قارن أيضا هذا المنشور.

يتم تجميع H2 مع تطبيق مسبح اتصال مدمج. يوفر XML التالي مثالا على استخدامه كحبة DataSource بدون حاجة لإدخال تبعيات إضافية على DBCP أو C3P0:

<bean id="dataSource" class="org.h2.jdbcx.JdbcConnectionPool" destroy-method="dispose">
    <constructor-arg>
        <bean class="org.h2.jdbcx.JdbcDataSource">
            <property name="URL" value="jdbc:h2:dbname"/>
            <property name="user" value="user"/>
            <property name="password" value="password"/>
         </bean>
    </constructor-arg>
</bean> 

سيتم إيقاف قاعدة البيانات عن طريق استدعاء طريقة التخلص عند إغلاق سياق تطبيق الربيع.

أعتقد أنه من الأفضل استخدام تطبيق DataSource الإنتاج الخاص بك (فقط مع سلسلة اتصال مختلفة) للاختبارات الوحدة.

على أي حال "فشل في الاختبارات الأكثر تعقيدا" لا يعطي معلومات كافية للحصول على إجابة أكثر تفصيلا.

(الإعلان الذاتي: افحص هذا)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top