上面篇文章中介紹了 H2 的一些特性跪呈。H2 因其提供了內(nèi)存數(shù)據(jù)庫(kù)的模式,經(jīng)常應(yīng)用在測(cè)試當(dāng)中镇饮,快速驗(yàn)證某些SQL 操作的結(jié)果蜓竹。本文將 H2 應(yīng)用于測(cè)試中的原因,并使用一個(gè)簡(jiǎn)單的實(shí)例說(shuō)明 H2 在測(cè)試中的使用储藐。
對(duì) H2 提供的全文索引感興趣可參考:《H2 提供全文索引功能》
1俱济, 為什么將 H2 適合應(yīng)用在測(cè)環(huán)境中?
代碼中的測(cè)試需要滿足 FIRST 原則:
? Fast 快的
? Independent 獨(dú)立的
? Repeatable 可重復(fù)的
? Self-validating 自驗(yàn)證的
? Timely 及時(shí)的
傳統(tǒng)的數(shù)據(jù)庫(kù)安裝钙勃、啟動(dòng)使用都需要一個(gè)很長(zhǎng)的過(guò)長(zhǎng)蛛碌,無(wú)法滿足測(cè)試環(huán)境對(duì)快速驗(yàn)證的需求。而
H2 提供了 In-Memory Mode辖源,能將數(shù)據(jù)在內(nèi)存中進(jìn)行操作蔚携,速度會(huì)記更加快,能夠讓測(cè)試快讀驗(yàn)證克饶;
另外由于 H2 安裝酝蜒、啟動(dòng)都非常方便能夠使測(cè)試在本地、集成測(cè)試環(huán)境能夠快速搭建測(cè)試環(huán)境并進(jìn)行驗(yàn)證矾湃;
In-Memory Mode 的 H2 每次啟動(dòng)程序都能夠得到一致的數(shù)據(jù)上下文亡脑,方便構(gòu)建測(cè)試數(shù)據(jù)環(huán)境;
H2 對(duì)數(shù)據(jù)類型邀跃、SQL 支持的較為完成霉咨,合適的環(huán)境更加豐富;
2拍屑, Spring Boot 項(xiàng)目測(cè)試中使用 H2
這里項(xiàng)目環(huán)境是使用 Gralde 構(gòu)建的 Spring Boot 項(xiàng)目途戒。源碼: https://github.com/tengbai/h2-for-test
- 在 build.gradle 中引入 H2
testImplementation 'com.h2database:h2'
- 編寫一個(gè)測(cè)試并補(bǔ)齊其依賴上下文
@SpringBootTest
class CarRepositoryTest {
@Autowired
private CarRepository carRepository;
@Test
void should_got_3L_order_when_count_given_a_new_order_and_initialized_2_cars_in_sql() {
carRepository.save(new Car("Mazda"));
long countAfterSavedNew = carRepository.count();
then(countAfterSavedNew).isEqualTo(3L);
}
}
- 補(bǔ)齊測(cè)試相關(guān)的依賴
@NoArgsConstructor
@Data
@Entity
@Table(name = "cars")
public class Car {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
public Car(String name) {
this.name = name;
}
}
@Repository
public interface CarRepository extends JpaRepository<Car, Long> {
}
- 配置 build.gradle 中對(duì) H2 的依賴
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'com.h2database:h2'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
- 表結(jié)構(gòu) schema.sql
create table cars
(
id bigint generated always as identity not null,
name varchar(20),
primary key (id)
);
- 初始化 data.sql
insert into cars values (1, 'benz'),(2, 'benz');
- 設(shè)置測(cè)試環(huán)境的配置,test/resources/application.properties
spring.datasource.schema=schema.sql
spring.datasource.data=data.sql
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
spring.jooq.sql-dialect=org.hibernate.dialect.H2Dialect
其中:
spring.datasource.schema
指定數(shù)據(jù)庫(kù)表結(jié)構(gòu)
spring.datasource.data
指定數(shù)據(jù)庫(kù)初始化數(shù)據(jù)
運(yùn)行測(cè)試后丽涩,能夠看到在 H2 中新增了一條新的數(shù)據(jù)棺滞,測(cè)試啟動(dòng)和運(yùn)行速度非常快矢渊。
擴(kuò)展
借助 flyway 等數(shù)據(jù)庫(kù)版本版本管里管理功能,更加更加方便的在本地測(cè)試中進(jìn)行數(shù)據(jù)庫(kù)操作的相關(guān)測(cè)試枉证。