Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Module 我是否可以将对象仅用于集成测试和/或基准测试?_Module_Rust_Integration Testing_Rust Cargo - Fatal编程技术网

Module 我是否可以将对象仅用于集成测试和/或基准测试?

Module 我是否可以将对象仅用于集成测试和/或基准测试?,module,rust,integration-testing,rust-cargo,Module,Rust,Integration Testing,Rust Cargo,根据的建议,我已将机箱中的集成测试移动到tests目录中。但是,其中一些测试使用了我不想导出到机箱外的函数,并且我不再能够在integration test文件夹中使用它们。我也将它们用于非测试目的,因此它们也需要在测试之外编译。我尝试使用的变体,但无法使其工作。理想情况下,我希望有类似于pub(tests)的东西 目录树(相关位): 测试/解析.rs: extern crate my_crate; use my_crate::parser::foo; #[test] fn temp() {

根据的建议,我已将机箱中的集成测试移动到
tests
目录中。但是,其中一些测试使用了我不想导出到机箱外的函数,并且我不再能够在integration test文件夹中使用它们。我也将它们用于非测试目的,因此它们也需要在测试之外编译。我尝试使用的变体,但无法使其工作。理想情况下,我希望有类似于
pub(tests)
的东西

目录树(相关位):

测试/解析.rs:

extern crate my_crate;

use my_crate::parser::foo;

#[test]
fn temp() {
    foo();
}
#![feature(test)]
extern crate test;
extern crate my_crate;

use test::Bencher;
use my_crate::parser::foo;

#[bench]
fn temp(b: &mut Bencher) {
    b.iter(|| { foo(); });
}
工作台/rs:

extern crate my_crate;

use my_crate::parser::foo;

#[test]
fn temp() {
    foo();
}
#![feature(test)]
extern crate test;
extern crate my_crate;

use test::Bencher;
use my_crate::parser::foo;

#[bench]
fn temp(b: &mut Bencher) {
    b.iter(|| { foo(); });
}

我目前的解决方法是使相关对象
pub
lic在文档中不可见(
#[doc(hidden)]
),但它没有传达正确的意图。集成测试和单元测试之间的一个区别是,集成测试应该只测试机箱的“公共API”。内部函数的测试可以与
src
树中的函数本身保持在一起

如果您想将它们分开一点,可以使用测试子模块来测试包含要测试的函数的模块,因为子模块可以使用私有部分

如果仍然希望在
tests
目录中的测试中包含内部/单元测试,则可以使用功能标志启用内部函数的公共包装器进行测试(并使用相同的功能标志标记测试)。代码中的类似内容:

#[cfg(feature = "testable_privates")]
pub fn exposed_something(args) {
    something_private(args)
}
然后在测试方法中,您可以导入并调用
exposed\u something
。如果未定义功能
testable\u privates
,则测试将无法编译。为了解决这个问题,使用特征标志也使测试有条件

#[cfg(feature = "testable_privates")]
#[test]
fn test_something() {
    assert_eq!(exposed_something(my_args), expected_result)
}
此外,在执行此操作之前,您需要在
Cargo.toml
中定义功能,如下所示:

[features]
testable_privates = []
(空数组表示该功能不需要任何其他可选依赖项)

现在,如果您只是运行
cargo test
,那么暴露的东西和测试的东西都将被默默地忽略,但是如果您运行
cargo test——特性可测试的东西,它们将被编译和测试


如你所见,这变得相当复杂,因此,我真的认为从
测试中测试板条箱的公共方面是一个更好的主意,并在
src
中保持私有方法的测试接近这些方法本身。您可能可以通过添加一个只在测试时存在并且重新导出所需符号的公共模块来做到这一点。比如:

#[cfg(test)]
pub mod testing_parser {
    pub use parser::foo;
}

然后在测试中使用my_crate::testing_parser::foo

您是否在它们上尝试过
。[cfg(测试)]
。我也需要它们用于非测试目的。嗯。。。不确定是否可以只将条件放在
pub
上,我猜复制定义不是一个选项:我不想导出到板条箱外部的xuse函数-那么这不是一个集成测试。集成测试的目的是像用户一样练习代码。@Shepmaster tbh这在我的基准测试中出现,我认为它可能是特定于
Bencher
,但我对
测试进行了相同的检查,结果是相同的。因为后者比较容易分析,所以我选择了它作为主要主题。不幸的是,我得到了<代码>错误[E0364]:解析是私有的,不能再导出和<代码>注释:考虑将标记解析为导入模块< /代码>中的PUB。那么,您可以标记“代码>解析< <代码> > <代码> PUB<代码>,只要您将其放入私有模块中,它不能直接从您的板条箱外部访问,但可以重新出口。不幸的是,我刚刚检查了
#[cfg(test)]
项,集成测试禁用了这些项(即,对于位于
tests
文件夹中的测试),因此您可能需要使用
功能来启用Rasmus Kaj.Wrapper函数建议的重新导出模块(即使只有
#[cfg(test)]
)是函数的有效解决方案,但对于
enum
s或
struct
s则不然。在像
pub(特定的外部板条箱)
这样的东西出现之前,我想我只需要重新安排一下测试和基准测试:)。这有点不幸。集成测试没有理由不能访问内部函数来验证测试是否成功。它可以让他们写得更快更容易。忽略
#[cfg(test)]
只会让这变得困难,我看不到任何好处-/我认为这是完全有意义的,如果我们抛开单元/集成术语,看看测试到底是什么:内部测试在
/src
中,外部测试在
/tests
中。外部测试只访问您的公共api这一事实是完全不同的。