6 个版本

0.1.5 2021年6月15日
0.1.4 2021年6月14日

#345测试


2 工具包 使用

AGPL-3.0

135KB
3.5K SLoC

ArchTest

crates.io crates.io codecov license Crates.io Crates.2io

ArchTest 是一款基于规则的架构测试工具。它对指定的 Rust 项目进行静态分析,以提取使用关系。

功能

  • 按层级或模块级别检测循环依赖
  • 禁止父级访问
  • 定义层关系,如 MayNotAccessMayOnlyAccessMyNotBeAccessedByMayOnlyBeAccessedBy
  • 更多功能,请参考文档。

安装

你可以将其作为 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