我写了我的第一个ArchUnit测试:
import static com.tngtech.archunit.library.dependencies.SlicesRuleDefinition.*;
// more non-static imports
@RunWith(ArchUnitRunner.class)
@AnalyzeClasses(packages = "my.domain.project")
public class PackageStructureTests {
@ArchTest public static final ArchRule NO_CYCLES = slices().matching("my.domain.project.(**)")
.namingSlices("package:$1").should().beFreeOfCycles();
}
Run Code Online (Sandbox Code Playgroud)
问题是它还分析了测试中的类,这些类不遵循那个简单的依赖约束.
如何将测试限制为"生产"类?
该项目使用Maven构建,因此这些类位于不同的目录中.
将名称以"Tests"结尾的类分开是不够的,因为有许多类不是测试,但只存在于测试类路径中.
ArchUnit 是一个免费、简单且可扩展的库,用于使用任何普通 Java 单元测试框架检查 Java 代码的体系结构。也就是说,ArchUnit 可以检查包和类、层和切片之间的依赖关系,检查循环依赖关系等等。
我们正在编写一个越来越大的 JavaScript 应用程序。我们有一些我们希望能够强制执行的架构规则,主要用例是这样的:这些包不能要求那些。
JavaScript 生态系统中是否有可实现 ArchUnit 为 Java 所做的等效工具?
javascript architecture automated-tests unit-testing archunit
我正在使用 Clean Architecture 开发 Flutter 应用程序。现在我正在寻找一个图书馆或其他类似 ArchUnit 的东西。测试架构并确保包的正确访问。
您如何解决问题并确保符合架构。我很感激想法或替代方案。
我正在尝试使用ArchUnit进行单元测试,以检查是否有任何未使用的类。但我不知道如何检查 MyClass.class 是否引用了某个类。
例如我有一堂课:
public class MyClass {
...
}
Run Code Online (Sandbox Code Playgroud)
然后我用某种方法引用这个类:
public class MySecondClass{
public void methodA(){
methodThatTakesClassAsParameter(MyClass.class);
}
...
}
Run Code Online (Sandbox Code Playgroud)
如何从 ArchUnit 中看到 MyClass 是从 MySecondClass 引用的?
在 ArchUnit 中为分层架构创建规则时,我不清楚如何排除单个类 (Main)。 基本示例排除了源和目标。
...但我不明白它是如何转换成我的需要的。我只想忽略 Main 。为什么?因为 Main 引用了所有层,因为它将所有依赖项注入到位。
原始代码 与失败的测试一起在我的 GitHub 中。(该项目是一个虚拟项目,因此运行起来很简单;只需克隆它,运行测试并看到一个失败)。
我正在尝试编写一个 ArchUnit 测试规则,该规则应确保使用@ComponentInterface注释注释的接口具有使用注释注释的方法参数@Input。像这样:
ArchRule rule =
methods()
.that()
.areDeclaredInClassesThat()
.areInterfaces()
.and()
.areDeclaredInClassesThat()
.areAnnotatedWith(ComponentInterface.class)
.should()
.haveRawParameterTypes(
allElements(CanBeAnnotated.Predicates.annotatedWith(Input.class)));
Run Code Online (Sandbox Code Playgroud)
界面如下所示:
@ComponentInterface
public interface AdminComponent {
void login(@Input(name = "loginString") String loginString);
}
Run Code Online (Sandbox Code Playgroud)
但测试失败并出现如下错误:
Method < com.some.package.AdminComponent.login(java.lang.String)> does not have raw parameter types all elements annotated with @Input in (AdminComponent.java:0)
在这种情况下,规则应该如何才能正常工作?
PS 经过一些调试后,发现hasRawParameterTypes检查参数类型(类)是否被注释,而不是方法参数本身。因此它查看String类并发现它没有用@Input注释。很高兴知道,但这并不能解决问题。
我一直在寻找一个库或工具来测试我的 Django 项目架构,检查依赖项、层等,比如 Arch Unit for Java。但直到现在,我什么也没找到。我什至不知道在 Python/Django 项目中进行这些类型的测试是否可行。我知道 Django 本身已经检查了循环依赖。
我有一个类,它具有三个不应从某些类调用的方法。
我如何使用 Archunit 检查这一点?
例如
public class Foo {
public void method1() {
}
public void method2() {
}
public void method3() {
}
}
Run Code Online (Sandbox Code Playgroud)
method1 和 method2 只能由类 Bar1 和 Bar2 调用。
在我的根项目中,我有两个具有该包结构的子项目。
Project 1: com.app
Project 2: com.app.api
Run Code Online (Sandbox Code Playgroud)
在项目 1 中,我有一个用 ArchRules 定义的类,注释如下
@AnalyzeClasses( packages = "com.app")
public class ArchTests
Run Code Online (Sandbox Code Playgroud)
问题是,如果我运行该测试,它也会分析项目 2 中的所有内容。如何排除 com.app.api 包?
我得到了看似微不足道的用例,但我仍然无法弄清楚。让我们看一下包结构。
-- 通用包 -- 套餐1 ---- DAO - - 常见的 - - 服务 -- 套餐2 ---- 子包1 ---- 子包2
我想要实现的是创建一条规则,其中Package2中的所有类都不能使用Package1 中的任何类,除了公共类之外。到目前为止,我已经得到了这样的东西:
noClasses()
.that()
.resideInAPackage("package2..")
.should()
.resideInAnyPackage("package1..")
// and how write eg. except("package1.common")
.check(classes);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何从这个方程中排除package1.common。有人可以帮忙吗?
我偶然发现了以下片段。
ArchRule myRule = classes()
.that().resideInAPackage("..core..")
.should().onlyBeAccessed().byAnyPackage("..controller..");
Run Code Online (Sandbox Code Playgroud)
我想知道如何否定这个条件,所以测试应该检查core包是否未被controller包访问?
我有遵循 archunit 规则的应用程序,我得到:
NO_CLASSES_SHOULD_ACCESS_STANDARD_STREAMS
失败的规则 - 这意味着我无法使用标准 Java I/O 流。但我可以用什么来代替呢?
如何使用其他 Java 方法而不是标准流来避免这种架构规则?因为我的拱门规则失败了
archunit ×12
java ×6
architecture ×4
testing ×2
unit-testing ×2
annotations ×1
classpath ×1
dart ×1
django ×1
flutter ×1
flutter-test ×1
javascript ×1
python ×1
stream ×1