我有很多重复测试,我想以某种方式抽象它们.辅助方法很有用,但最重要的是.如果我能以某种方式在我的程序中生成测试方法,我将能够删除大量的复制粘贴代码Specification.
具体来说,我正在测试RPC层的方法.如果不以某种方式调用它们,大多数方法必须失败.所以我有Spock测试方法,如:
def observer = Mock(StreamObserver)
def rpc = new UserServiceRpc()
def "draftToOutbox: should fail when called without parent"() {
def request = draftToOutboxRequest().toBuilder().clearParent().build()
when:
rpc.draftToOutbox(request, observer)
then:
1 * observer.onError(_)
1 * observer.onCompleted()
}
def "outboxToDraft: should fail when called without parent"() {
def request = outboxToDraftRequest().toBuilder().clearParent().build()
when:
rpc.outboxToDraft(request, observer)
then:
1 * observer.onError(_)
1 * observer.onCompleted()
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,我不熟悉Groovy的元编程(编译时AST转换)功能,并且不确定如何做到这一点,是否有可能,以及这是否是一个好主意.一方面我有一些复制粘贴,但另一方面我的测试非常易读.不过,我倾向于拥有两全其美:没有复制粘贴的可读性.
在这种情况下,您可以使用数据驱动测试 与一些groovy东西,如下所示:
@Unroll
def "#method: should fail when called without parent"() {
given:
def request = "$methodToGetRequest"().toBuilder().clearParent().build()
when:
rpc."$methodToTest"(request, observer)
then:
1 * observer.onError(_)
1 * observer.onCompleted()
where:
methodToTest | methodToGetRequest
'draftToOutbox' | 'draftToOutboxRequest'
'outboxToDraft' | 'outboxToDraftRequest'
}
Run Code Online (Sandbox Code Playgroud)
编辑
使用方法指针的示例:
@Shared
String subjectToTest
def setupSpec() {
subjectToTest = "sTring To Test"
}
def "test using method pointers"() {
when:
def result = methodPointer()
then:
result == expectecResult
where:
expectecResult | methodPointer
'STRING TO TEST' | subjectToTest.&toUpperCase
'string to test' | subjectToTest.&toLowerCase
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
620 次 |
| 最近记录: |