macro_rules! impl_benchmark_test_suite {
(
$bench_module:ident,
$new_test_ext:expr,
$test:path
$(, $( $rest:tt )* )?
) => { ... };
}
Expand description
This creates a test suite which runs the module’s benchmarks.
When called in pallet_example_basic
as
impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::Test);
It expands to the equivalent of:
#[cfg(test)]
mod tests {
use super::*;
use crate::tests::{new_test_ext, Test};
use frame_support::assert_ok;
#[test]
fn test_benchmarks() {
new_test_ext().execute_with(|| {
assert_ok!(test_benchmark_accumulate_dummy::<Test>());
assert_ok!(test_benchmark_set_dummy::<Test>());
assert_ok!(test_benchmark_sort_vector::<Test>());
});
}
}
When called inside the benchmarks
macro of the pallet_example_basic
as
benchmarks! {
// Benchmarks omitted for brevity
impl_benchmark_test_suite!(Pallet, crate::tests::new_test_ext(), crate::tests::Test);
}
It expands to the equivalent of:
#[cfg(test)]
mod benchmarking {
use super::*;
use crate::tests::{new_test_ext, Test};
use frame_support::assert_ok;
#[test]
fn bench_accumulate_dummy() {
new_test_ext().execute_with(|| {
assert_ok!(test_benchmark_accumulate_dummy::<Test>());
})
}
#[test]
fn bench_set_dummy() {
new_test_ext().execute_with(|| {
assert_ok!(test_benchmark_set_dummy::<Test>());
})
}
#[test]
fn bench_sort_vector() {
new_test_ext().execute_with(|| {
assert_ok!(test_benchmark_sort_vector::<Test>());
})
}
}
Arguments
The first argument, module
, must be the path to this crate’s module.
The second argument, new_test_ext
, must be a function call which returns either a
sp_io::TestExternalities
, or some other type with a similar interface.
Note that this function call is not evaluated at compile time, but is instead copied textually into each appropriate invocation site.
The third argument, test
, must be the path to the runtime. The item to which this must refer
will generally take the form:
frame_support::construct_runtime!(
pub enum Test where ...
{ ... }
);
There is an optional fourth argument, with keyword syntax: benchmarks_path = path_to_benchmarks_invocation
. In the typical case in which this macro is in the same module as
the benchmarks!
invocation, you don’t need to supply this. However, if the
impl_benchmark_test_suite!
invocation is in a different module than the benchmarks!
invocation, then you should provide the path to the module containing the benchmarks!
invocation:
mod benches {
benchmarks!{
...
}
}
mod tests {
// because of macro syntax limitations, neither Pallet nor benches can be paths, but both have
// to be idents in the scope of `impl_benchmark_test_suite`.
use crate::{benches, Pallet};
impl_benchmark_test_suite!(Pallet, new_test_ext(), Test, benchmarks_path = benches);
// new_test_ext and the Test item are defined later in this module
}
There is an optional fifth argument, with keyword syntax: extra = true
or extra = false
.
By default, this generates a test suite which iterates over all benchmarks, including those
marked with the #[extra]
annotation. Setting extra = false
excludes those.
There is an optional sixth argument, with keyword syntax: exec_name = custom_exec_name
.
By default, this macro uses execute_with
for this parameter. This argument, if set, is subject
to these restrictions:
- It must be the name of a method applied to the output of the
new_test_ext
argument. - That method must have a signature capable of receiving a single argument of the form
impl FnOnce()
.