【问题标题】:Checking the architecture of your Clojure code with unit tests使用单元测试检查 Clojure 代码的架构
【发布时间】:2018-11-02 11:56:52
【问题描述】:

我受到启发购买了这本书:Building Evolutionary Architecturesclean architecture

其中一个概念是能够在代码中测试您的架构。 特别是我希望能够检查命名空间、层之间的依赖关系,并断言命名空间不会为另一层调用命名空间。

我所有的命名空间都在圆圈内:

这个想法是“控制器”内的命名空间不能在“实体”内导入命名空间,而只能导入他下面的命名空间(用例)。我想在我的单元测试中检测到这一点。

所以这应该在我的单元测试中失败:

(ns com.controller.core
  (:require [com.entities.core :as entities]
            [com.use-cases.core :as use-cases]))

(defn do-something [args]
      (let [use-cases-results (use-cases/do-something args)]
           (entities/do-some-other-thing use-cases-results)))

在 java 中,您可以使用 archunit 编写此类单元测试。

private final JavaClasses classes = new ClassFileImporter().importPackagesOf(Controller/core.class);

noClasses().that().resideInAPackage("..controller..").should().accessClassesThat().resideInAPackage("..use-cases..").check(classes);

您是否对 clojure 使用了类似的东西,或者您对如何解决这个问题有一些建议?

【问题讨论】:

  • 这是一个完全有效且有趣的问题,但一些吹毛求疵的人希望看到更具体的细节。您能否添加一个简短的示例 - 带有 2 或 3 个命名空间的小示例代码,以及它们之间的一些引用,以及您希望看到的那种测试形状的示例失败?
  • 顺便说一句,这是一个很好的近期代码质量工具列表:blog.jeaye.com/2017/08/31/clojure-code-quality。 Clojure 的作者 Rich Hickey 还有一个传奇的旧项目,名为 codeq:github.com/Datomic/codeq,它将 git repo 加载到 Datomic 数据库中,允许各种代码形状查询。有传言称,Cognitect 将在不久的将来给予 codeq 一些爱。
  • 另一个参考 - 有一个用 Clojure 编写的有趣项目,专注于代码质量和更深层次的技术和架构债务问题,请参阅此处:clojure.org/stories/empear。创始人是伟大的代码分析书籍《Code as a Crime Scene》的作者,更多信息请见adamtornhill.com
  • codeq 真的很酷!但在可能的情况下,我想要类似 archunit 的东西 :)
  • 我正在寻找完全相同的。我认为 Clojure 核心提供了实现这一点的工具,并且这个领域的库也专注于静态分析。遗憾的是,当一切都可以全局引用时,谨慎使用的美妙语言仍然会产生混乱。执行结构是阻止这种情况发生的好方法。

标签: java clojure architecture archunit


【解决方案1】:

使用ns-refers 怎么样:

(deftest controllers-should-not-refer-to-entities
  (is (->> (all-ns)
           (filter #(clojure.string/includes? % "controller"))
           (map ns-refers)
           (map vals)
           flatten
           (not-any? #(clojure.string/includes? % "entities")))))

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2015-03-06
    • 2011-05-15
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多