前言
写区块链智能合约离不开单元测试,甚至有些都是测试驱动开发,没有单元测试,没法保证程序可靠性,所以自己开发的,部署到链上的新合约一定要有单元测试保证。所以看一下cairo的单元测试写法。
第一个简单case学习用法
使用scarb 创建
scarb new firstcase
firstcase
├── Scarb.toml
└── src
└── lib.cairo
在lib.cairo中写入如下代码:
#[test]
fn it_works() {
let result = 2 + 2;
assert(result == 4, 'result is not 4');
}
运行测试case: scarb cairo-test
$ scarb cairo-test
testing adder...
running 1 tests
test adder::lib::tests::it_works ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 0 filtered out;
以上就是一个最简单的测试用例,没有测试任何测试函数,但是学些了测试case的写法,主要的语法要点是: [test] , assert。
assert
和其他语言一样,cairo使用assert,来断言case是否正确。assert接收两个参数, 第一个参数是bool, 第二个参数是一个字符串msg。如果第一个参数是true,则测试通过。如果第一个参数是false, 则抛出一个包含第二个参数内容的 panic。
should_panic
如果测试的case期望抛出panic, 那么就用#[should_panic] 修饰测试函数。这样程序就认为这是一个预期之内的panic。
#[test]
#[should_panic]'
运行指定测试例子
有时候,所有测试case运行起来很费时间,只需要运行某个指定的case(因为可能只是修改了这个case内部的逻辑),使用如下的方式 scarb cairo-test -f (过滤器),如下代码,只想运行add_two_and_two 这一个case。运行命令与输出结果如第二个图。
#[cfg(test)]
mod tests {
#[test]
fn add_two_and_two() {
let result = 2 + 2;
assert(result == 4, 'result is not 4');
}
#[test]
fn add_three_and_two() {
let result = 3 + 2;
assert(result == 5, 'result is not 5');
}
}
scarb cairo-test -f add_two_and_two
running 1 tests
test adder::lib::tests::add_two_and_two ... ok
test result: ok. 1 passed; 0 failed; 0 ignored; 1 filtered out;
忽略case
有时候,我们想忽略某些个case,但是不想用-f参数,这个毕竟属于白名单性质。 忽略case属于直接跳过。 那么就可以用 #[ignore] 装饰。
#[cfg(test)]
mod tests {
#[test]
fn it_works() {
let result = 2 + 2;
assert(result == 4, 'result is not 4');
}
#[test]
#[ignore]
fn expensive_test() { // code that takes an hour to run
}
}
使用了#[ignore]的case。expensive_test 在使用命令 scarb cairo-test测试时候 就不会运行了。