Я перейду прямо к делу. Это моя структура папок
|----Project HEAD
|-------------------src
|-------------------copy.rs
|-------------------main.rs
|-------------------helper.rs
|-------------------copy_bench.rs
а это мой грузовой томл:
[package]
name = "copy_experiments"
version = "0.1.0"
edition = "2021"
[dependencies]
chrono = "0.4.37"
crossbeam = "0.8.4"
rayon = "1.10.0"
tabled = "0.15.0"
[dev-dependencies]
criterion = {version = "0.5.1"}
[[bench]]
name = "copy_bench"
path = "src/copy_bench.rs"
harness = false
Теперь у меня есть несколько функций, написанных в copy.rs, которые я хочу протестировать. как я могу это сделать, не реорганизовывая все? Я попытался преобразовать copy.rs в lib, но copy.rs больше не может использовать функции из helper.rs. Я бы предпочел ничего не реорганизовывать, если это возможно
например: копир.рс:
use crate::helper::somefunc; // this becomes unresolved if copy.rs is converted to lib
без преобразования copy.rs в lib я не могу использовать функцию из копии, даже если они находятся в одной папке
как только я упомяну путь под [[bench]]
use crate::copy;
, он станет неразрешенным
Каково решение этой проблемы? Обычно я привык к C, где я могу включать все, что захочу, но это озадачивает, и любое руководство в правильном направлении приветствуется.
@ChayimFriedman, я имею в виду, что это решение, но нет ли другого элегантного способа решить эту проблему, который был бы разумным и не включал бы копирование всего? например, допустим, я ввожу find.rs
и переименовываю copy_bench.rs
в bench.rs
, где я нахожу и копирую, а затем мне снова приходится копировать все из find.rs
. это решает проблему, но кажется неправильным
Временно экспортировать его, а затем снова скрыть?
@ChayimFriedman, возможно, это то, что я ищу, но я не знаю, как их временно экспортировать, а затем снова скрыть или что именно это означает
Сделайте это pub
, запустите тест, удалите pub
.
Я пробовал это pub mod copy;
, pub use copy::cp;
и mod bench_lib.rs
в main.rs и use super::*;
в Bench_lib.rs, но потом получаю ошибку ``` --> src/bench_lib.rs:1:5 | 1 | используйте супер::*; | ^^^^^ слишком много ведущих super
ключевых слов```
Это похоже на проблему XY. Тот факт, что у вас возникла проблема с тестом, указывает на то, что ваш проект плохо структурирован, но вместо того, чтобы решить эту проблему, вы, похоже, пытаетесь найти способы избежать ее. Ваш проект еще недостаточно велик, поэтому его реструктуризация должна стать серьезной проблемой сейчас, но когда проект намного больше и другие вещи не работают должным образом, это может оказаться гораздо более трудным процессом.
Должно быть use your_crate_name::copy::cp
(контрольные точки см. ящик снаружи). Также условно вы ставите ориентиры под /benches
.
@ChayimFriedman спасибо за ваше руководство. Наконец я понял: способ создания библиотеки был неправильным, и затем я попытался решить проблему, не создавая библиотеку, но это не было решением.
Успешно протестировать несколько модулей в Rust с помощью критерия. Вам понадобится папка lib. Вы можете создать свою библиотеку как таковую, вставив следующую строку в свой cargo.toml
:
[lib]
name = "lib"
path = "src/lib/mod.rs"
В папке lib mod.rs будет точкой входа для всех ваших подмодулей. если у вас есть структура папок lib, например:
|--------lib
|---------copy.rs
|---------etc.rs
|---------etc2.rs
|---------mod.rs
тогда ваш mod.rs должен выглядеть так:
pub mod copy;
pub mod etc1;
pub mod etc2;
после этого, если у вас есть вспомогательный модуль, скажем в данном случае etc1
, и вы хотите использовать вспомогательный модуль в модуле копирования, вам следует добавить следующее copy.rs
use crate::ect1::somefunc2;
тогда вы в своем файлеbench.rs сможете использовать
use lib::copy::somefunc;
Надеюсь, это поможет новичкам, таким как я.
Я бы просто скопировал функции, которые вы хотите протестировать, в свой тест или временно экспортировал их.