6 个版本
0.1.5 | 2021年6月15日 |
---|---|
0.1.4 | 2021年6月14日 |
#345 在 测试 中
被 2 工具包 使用
135KB
3.5K SLoC
ArchTest
ArchTest 是一款基于规则的架构测试工具。它对指定的 Rust 项目进行静态分析,以提取使用关系。
功能
- 按层级或模块级别检测循环依赖
- 禁止父级访问
- 定义层关系,如
MayNotAccess
、MayOnlyAccess
、MyNotBeAccessedBy
、MayOnlyBeAccessedBy
- 更多功能,请参考文档。
安装
你可以将其作为 Cargo 的子命令或作为开发者依赖中的包进行安装。
# Sub command
cargo install cargo-archtest --force
# Package
[dev-dependencies]
arch_test_core = "*"
如何使用
使用 Cargo 子命令
在 cargo 根路径下定义一个名为 architecture.json
的文件。根据 Specification
结构体填写它。示例
{
"layer_names": ["analyzer", "parser", "domain_values", "entities", "materials", "services", "tests", "utils"],
"access_rules": [
"NoLayerCyclicDependencies",
"NoModuleCyclicDependencies",
"NoParentAccess",
{
"MayNotAccess": {
"accessor": "parser",
"accessed": ["analyzer"],
"when_same_parent": true
}
},
{
"MayOnlyBeAccessedBy": {
"accessors": ["services", "tests"],
"accessed": "materials",
"when_same_parent": false
}
},
{
"MayNotBeAccessedBy": {
"accessors": ["materials", "domain_values", "entities", "utils"],
"accessed": "services",
"when_same_parent": true
}
}
]
}
使用 Rust 测试
你可以使用 Architecture
结构体来定义你的架构。之后,你可以检查是否有失败。
let architecture = Architecture::new(hash_set!["analyzer".to_owned(), "parser".to_owned(), ...])
.with_access_rule(NoParentAccess)
.with_access_rule(NoModuleCyclicDependencies)
.with_access_rule(NoLayerCyclicDependencies)
...
.with_access_rule(MayNotAccess::new(
"materials".to_owned(),
hash_set!["tests".to_owned()],
true,
));
let module_tree = ModuleTree::new("src/lib.rs");
assert!(architecture.validate_access_rules().is_ok());
assert!(architecture.check_access_rules(&module_tree).is_ok());
如果你对失败感兴趣,可以像这样进行美化输出
architecture.check_access_rules(&module_tree).err().unwrap().print(module_tree.tree());
持续集成
你可以通过以下方法之一在持续集成中使用它。如果你决定在 GitHub 上使用 Cargo 子命令,以下片段将允许你测试你的项目。
arch_test:
name: ArchTest
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions-rs/install@v0.1
with:
crate: cargo-archtest
version: latest
- run: cargo archtest
依赖
~3–4.5MB
~90K SLoC