ユニットテストは長い間ホットなトピックでした。この記事では単一のテストについて説明したり、作成する必要はありません。参考資料1を参照してください。個人的には、優れた開発者ごとに単一のメジャーを作成し、必要なスキルを1つのメジャーに作成する必要があると考えています。ここでは利点については説明しませんが、この記事で焦点を当てているトピック、優れたデータベース単一テストの作成方法について簡単に説明します。
なぜデータベースの単一テストを作成したいのですか?複雑なSQLステートメントを作成した後、自信を持ってテストを作成した後、バグの大部分がSQLステートメントの問題によるものであることがわかった、または書き込みが少ないなど、同様の経験があると思います。カンマ、またはフィールドが欠落している、私はすごいことを後悔しています、それを書いた後にそれをテストしてみませんか!
大丈夫です!これにより、データベースの単一テストの作成方法がわかり、データベース関連のバグに簡単に別れを告げることができます。
1.データベースのサンプルと環境
例としてuserテーブルを使用してこのチュートリアルを開始しましょう。
mybatis-plusプラグインを導入した後、マッパークラスは次のようになります。
@Mapper
public interface UserMapper extends BaseMapper<UserDO> {
}
全体的な環境:
- スプリングブーツ:1.5.18.RELEASE
- mybatis:3.5.1
- mybatis plus:3.4.0(現時点では最新バージョンです。最新バージョンの機能を使用します)
ここでは、mybatis plusが提供するいくつかのCRUDを直接テストします。もちろん、これらのCRUDは一般的に間違っていません。実際のプロジェクトでは、カスタムSQLをユニットテストするだけで済みます。
2.方法1:環境全体を開始します
この方法は、日常の環境で最も一般的に使用されるはずです。バージョン1.4.0以降にSpringBootによって導入された@SpringBootTestアノテーションは、ユニットテストに必要なすべての環境を開始できます。もちろん、プロジェクトで他の分散サービスを使用する場合は、彼もこれらのサービスも開始されます。単一のテストコードは次のとおりです。
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCurd() {
UserDO userDO = new UserDO();
userDO.setId(7777L);
userDO.setGmtModified(new Date());
userDO.setGmtCreate(new Date());
userDO.setRealName("ke");
userDO.setUserName("ni");
userMapper.insert(userDO);
UserDO select = userMapper.selectById(1);
System.out.println(select);
}
}
@SpringBootTestアノテーションは、オンデマンドで開始およびロードする必要があるクラスを設定できます
3.方法2:データベース環境+リモートデータベースのみを起動します
参考文献2では、次の図に示すように、テストスターターが最新のmybatis-plusリリースバージョン(3.4.0)で導入されています。
モジュールは新しい注釈を導入します@MybatisPlusTest
。この注釈は、特定の特定のモジュールを単一のテストコードで直接開始するのに役立ちます。
@RunWith(SpringRunner.class)
@MybatisPlusTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class UserMapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void testCurd() {
UserDO userDO = new UserDO();
userDO.setId(7777L);
userDO.setGmtModified(new Date());
userDO.setGmtCreate(new Date());
userDO.setRealName("ke");
userDO.setUserName("ni");
userMapper.insert(userDO);
UserDO select = userMapper.selectById(1);
System.out.println(select);
}
}
簡単ですか?ただし、次の重要な点に注意する必要があります。
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
役割は、自動的に構成された組み込みメモリデータソースの代わりにカスタムデータソースを使用することです- プロジェクトでdruidと同様の接続プールを使用している場合、
@MybatisPlusTest
注釈によって接続プールフレームワークが開始されないため、テストモジュールのアプリケーション構成ファイルでjdbcデータソースを直接使用する必要があります。一般的な構成ファイルapplication.ymlは次のとおりです。
spring:
datasource:
url: jdbc:mysql://xxx.xxx.1.110:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
4.方法3:データベース環境+ローカルデータベースのみを起動します
方法2に基づいて、次の手順に従います。
@AutoConfigureTestDatabas
注釈を削除し、組み込みデータベースのテストを直接開始します。ここでは、H2メモリデータベースを選択し、最初にpomにH2データベースのmaven依存関係を導入します。- 次に、テスト環境にsechema.sqlファイルを導入します。このファイルはデータベースを初期化するために使用されます。コアはテーブルステートメントを作成することです。
- 最後に、このページを削除した後の書き込み方法は2つ目と同じなので、ここでは説明しません。
注: sechema.sqlファイルは、組み込みデータベースの構文に準拠している必要があります。この場合は、h2データベースです。mysqlデータベースを使用している場合は、mysqlデータベースの構文をh2データベースの構文に変換する必要があります。
5. @ MybatisPlusTestアノテーションの原則
以前にMyBatis-Spring-Boot-Starter-Test @MybatisTest
(リファレンス3)を使用したことがある場合@MybatisPlusTest
は、注釈の原則がそれに類似しており、すべてがスプリングブートの自動構成を制限し(リファレンス4)、特定のロードのみが必要であることがわかります。構成は可能です。注釈のソースコードを見てみましょう。
@Target({
ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@BootstrapWith(MybatisPlusTestContextBootstrapper.class)
@ExtendWith({
SpringExtension.class})
@OverrideAutoConfiguration(
enabled = false
)
@TypeExcludeFilters({
MybatisPlusTypeExcludeFilter.class})
@Transactional
@AutoConfigureCache
@AutoConfigureMybatisPlus
@AutoConfigureTestDatabase
@ImportAutoConfiguration
public @interface MybatisPlusTest {
String[] properties() default {
};
boolean useDefaultFilters() default true;
Filter[] includeFilters() default {
};
Filter[] excludeFilters() default {
};
@AliasFor(
annotation = ImportAutoConfiguration.class,
attribute = "exclude"
)
Class<?>[] excludeAutoConfiguration() default {
};
}
@OverrideAutoConfiguration(enabled = false)
重要なのは、自動構成をオフにし、通常、スプリングブートプロジェクトでは、有効化をオンにします。@AutoConfigureMybatisPlus
注釈はカスタム注釈です。この注釈は、ロードする必要のあるすべてのロードクラスを定義します。自動的に構成されるクラスは、spring.factoriesで宣言されます。
# AutoConfigureMybatis auto-configuration imports
com.baomidou.mybatisplus.test.autoconfigure.AutoConfigureMybatisPlus=\
org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\
org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\
org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\
org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusLanguageDriverAutoConfiguration,\
com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration
@AutoConfigureTestDatabase
注釈は、実際のデータベースの代わりにメモリ内データベースが使用されていることを示しています
これらの制限と規制により、mybatis-plusは必要な構成をテスト環境に自動的にロードできるため、不要なリソースのロードが不要になります。
6.まとめ
mysqlデータベースを使用している場合は、2番目の方法をお勧めします。mysq文法をh2に変換する問題を解決できる場合は、方法3を使用することをお勧めします。これにより、リモートデータベースに接続しなくても、オフラインの状況でも1つのテストを実行できます。
PS:mysql変換h2を完了するための優れたツールがある場合は、コメント領域でそれをお勧めできます。カスタム書き込み変換、いくつかのプロフェッショナルツールなど、長い間探していましたが、Navicatによってエクスポートされた文の変換はあまり良くないと感じています。うまく機能します。
7.参考資料
[1]本当にユニットテストが必要ですか?
[2] Mybatis-Plusリリースバージョン
[3] MyBatis-Spring-Boot-Starter-Test
[4] SpringBootの4つのアーティファクトの自動構成