Как использовать критерий для тестирования в Rust без наличия библиотеки в грузовом томле?

Я перейду прямо к делу. Это моя структура папок

|----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, где я могу включать все, что захочу, но это озадачивает, и любое руководство в правильном направлении приветствуется.

Я бы просто скопировал функции, которые вы хотите протестировать, в свой тест или временно экспортировал их.

Chayim Friedman 16.04.2024 23:47

@ChayimFriedman, я имею в виду, что это решение, но нет ли другого элегантного способа решить эту проблему, который был бы разумным и не включал бы копирование всего? например, допустим, я ввожу find.rs и переименовываю copy_bench.rs в bench.rs, где я нахожу и копирую, а затем мне снова приходится копировать все из find.rs. это решает проблему, но кажется неправильным

Pragmatic 16.04.2024 23:52

Временно экспортировать его, а затем снова скрыть?

Chayim Friedman 16.04.2024 23:54

@ChayimFriedman, возможно, это то, что я ищу, но я не знаю, как их временно экспортировать, а затем снова скрыть или что именно это означает

Pragmatic 16.04.2024 23:55

Сделайте это pub, запустите тест, удалите pub.

Chayim Friedman 16.04.2024 23:56

Я пробовал это 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 ключевых слов```

Pragmatic 16.04.2024 23:59

Это похоже на проблему XY. Тот факт, что у вас возникла проблема с тестом, указывает на то, что ваш проект плохо структурирован, но вместо того, чтобы решить эту проблему, вы, похоже, пытаетесь найти способы избежать ее. Ваш проект еще недостаточно велик, поэтому его реструктуризация должна стать серьезной проблемой сейчас, но когда проект намного больше и другие вещи не работают должным образом, это может оказаться гораздо более трудным процессом.

Claies 17.04.2024 00:00

Должно быть use your_crate_name::copy::cp (контрольные точки см. ящик снаружи). Также условно вы ставите ориентиры под /benches.

Chayim Friedman 17.04.2024 00:01

@ChayimFriedman спасибо за ваше руководство. Наконец я понял: способ создания библиотеки был неправильным, и затем я попытался решить проблему, не создавая библиотеку, но это не было решением.

Pragmatic 17.04.2024 00:21
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
0
9
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Успешно протестировать несколько модулей в 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;

Надеюсь, это поможет новичкам, таким как я.

Другие вопросы по теме