赞
踩
Groovy是一种基于JVM的动态语言,它可以与Java代码无缝集成。Spock是一个基于Groovy的测试框架,专注于简洁性和可读性。它提供了丰富的测试DSL(领域特定语言),支持行为驱动开发(BDD)风格的测试。
使用Groovy和Spock进行单元测试时,你可以利用Spock的特性编写清晰、易读的测试用例。通过given
, when
, then
和where
块,你可以清晰地描述测试的前提条件、操作和预期结果。同时,Spock还提供了@Unroll
注解,可以让你以数据驱动的方式执行测试用例,从而更全面地覆盖不同的测试场景。
要使用Groovy和Spock进行单元测试,你可以创建一个继承自spock.lang.Specification
的测试类,编写测试用例并使用given
, when
, then
和where
块来描述测试逻辑和数据驱动的测试场景。
import spock.lang.Specification class MathSpec extends Specification { def "addition test"() { given: "two numbers" def a = 5 def b = 3 when: "adding the numbers" def result = a + b then: "the result should be correct" result == 8 } def "division test"() { given: "two numbers" def a = 10 def b = 2 when: "dividing the numbers" def result = a / b then: "the result should be correct" result == 5 } }
在这个示例中,我们创建了一个MathSpec
测试类,其中包含了两个测试用例addition test和division test。每个测试用例都包含了given, when和then块,分别描述了测试的前提条件、操作和预期结果。
你可以在given块中设置测试所需的初始条件,在when块中执行操作,而then块用于验证预期结果。这种清晰的结构使得测试用例易于理解和维护。
如果需要对多组数据执行相同的测试逻辑,可以使用where块和@Unroll注解来进行数据驱动的测试。
import spock.lang.Specification class MathSpec extends Specification { def "multiplication test"(int a, int b, int expected) { expect: a * b == expected where: a | b | expected 2 | 3 | 6 5 | 5 | 25 10 | 4 | 40 } @Unroll def "division test"(int a, int b, int expected) { expect: a / b == expected where: a | b | expected 10 | 2 | 5 20 | 4 | 5 30 | 3 | 10 } }
在这个示例中,我们定义了两个测试用例,分别是multiplication test和division test。每个测试用例都使用where块提供了多组输入数据。@Unroll注解用于展开测试结果,使得每组数据都会生成一个独立的测试用例。
通过这种方式,可以很方便地对多组输入数据执行相同的测试逻辑,并清晰地了解每组数据的测试结果。
在实际开发过程中,验证创建患者信息的不同场景,包含:
通常创建一个基类,添加@SpringBootTest注解,并继承 spock.lang.Specification
类。
@SpringBootTest
@ContextConfiguration(classes = Application.class)
class BaseTest extends Specification {
@Autowired
protected H2Flusher h2Flusher;
void setup() {
h2Flusher.flushDB();
}
void cleanup() {
}
}
通常采用内存数据库进行处理,比如H2,最好使用单独的Profile
进行单测。
Springboot下H2数据库的配置
# 数据源配置 spring: datasource: type: com.zaxxer.hikari.HikariDataSource url: jdbc:h2:mem:database_name;DB_CLOSE_DELAY=-1;MODE=MYSQL username: sa password: driver-class-name: org.h2.Driver hikari: connection-test-query: SELECT 1 maximum-pool-size: 10 h2: console: path: /h2 enabled: true settings: trace: true web-allow-others: true sql: init: platform: h2 schema-locations: classpath*:sql/init/schema/schema-{platform}.sql data-locations: classpath*:sql/init/data/data-{platform}.sql
在H2数据库的URL中,MODE=MYSQL
参数的意思是使用MySQL兼容模式。当你在H2数据库的URL中添加MODE=MYSQL
参数时,H2数据库会尽可能地模拟MySQL的行为,以便在开发和测试过程中,更好地与MySQL进行集成和迁移。
这意味着你可以使用类似于MySQL的语法和功能,例如特定的SQL语法、函数、存储过程等。这对于在开发阶段使用H2数据库进行测试,并在生产环境中使用MySQL数据库的情况非常有用。
通常会在用例执行前后进行一些脚本加载和数据清理的工作,基于MySQL的SQL语句在H2环境中可能无法执行,我们又不想维护两套SQL。因此我们可以只提供MySQL的SQL语句,通过提供转换工具实现SQL语句的自动转换。可以使用开源工具,如
当将基于MySQL的SQL语句转换为H2数据库的SQL语句时,需要注意以下几个主要的差异点:
数据类型差异:
SQL语法差异:
存储过程和触发器:
SQL方言:
这些差异点需要在进行数据库迁移时仔细考虑和验证,以确保转换后的SQL语句在H2数据库中能够正确执行。
<properties> <spock.version>2.0-M2-groovy-3.0</spock.version> </properties> <dependencies> <dependency> <groupId>org.spockframework</groupId> <artifactId>spock-core</artifactId> <version>${spock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.spockframework</groupId> <artifactId>spock-spring</artifactId> <version>${spock.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>com.github.AlphaHinex.mysql2h2-converter</groupId> <artifactId>mysql2h2-converter</artifactId> <version>v0.2.2</version> </dependency> </dependencies> <repositories> <repository> <id>jitpack.io</id> <url>https://jitpack.io</url> </repository> </repositories>
private static String convertToH2Script(String mysqlScript) throws ParseException {
Iterator<SqlStatement> sourceIterator = SQLParserManager.parseScript(new StringReader(mysqlScript));
Iterator<SqlStatement> converted = H2Converter.convertScript(sourceIterator);
StringBuilder content = new StringBuilder();
while (converted.hasNext()) {
content.append(converted.next().toString());
}
return content.toString();
}
MySQL 脚本转 H2
mysql2h2-converter
how to get mysql2h2-converter v0.3.1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。