建筑测试 - 立即标准化项目的架构!
#测试 #java #testdev #体系结构

介绍

image

很多次我们开始一个项目时,我们遇到的最大困难是在组织包裹,班级和定义时,哪个班级可以访问其他班级,在击败这个困难之后,我们的下一个挑战是维护该组织以及未来开发人员甚至我们的文档,我们如何定义项目的体系结构,这就是您接下来会看到的!

为什么要建筑测试?

Image description

如前所述,除了更多地组织我们的项目并定义公约外,我们设法以一种非常友好的方式进行了文档,如下所示,我们看到了一条规则,告知了 ementity的课程应该居住:

@ArchTest
    static final ArchRule entities_must_reside_in_a_domain_package =
            classes().that().areAnnotatedWith(Entity.class).should().resideInAPackage("..domain..")
                    .as("Entities must reside in the domain package");

但是我们现在如何实践呢? :)

我们将使用什么技术?

image

对于本文,我们需要在我们的项目中拥有以下技术:

  1. Java 8+:版本8+
  2. 中的Java编程语言
  3. Maven:Java中的依赖关系管理工具。
  4. ArchUnit:将用于开发我们建筑测试的工具
  5. Spring:编程框架

我不会使用太多使用的技术,因为这不是我们本文的目的。

设置我们的项目:

image

为了使我们在项目中使用 Archunit ,我们需要添加以下依赖性:

<dependency>
    <groupId>com.tngtech.archunit</groupId>
    <artifactId>archunit-junit5</artifactId>
    <version>0.18.0</version>
    <scope>test</scope>
</dependency>

之后,我们将在我们的测试软件包中创建一个称为 Architecturetest 的单个类,该类别将在此第一刻具有以下实现:


@AnalyzeClasses(
        packages = "YourPackage",
        importOptions = ImportOption.DoNotIncludeTests.class
)
public class ArchitectureTest {
}

注意:在上面的示例中,插入了一个选项,以使测试不包括在我们的验证中,但是如果您也想以测试的名义定义模式,请感觉自由。 :)

现在,让我们开始感兴趣! = d

Image description

一起,我们将定义一个简单的体系结构,其中我们将拥有 Controller 类,该类只能调用服务类,并且只能调用<<强>存储库类,如下图所示:

image

之后,我们将定义每个班级的名称的外观,最后,它将居住在什么包中,也就是说,让我们创建我们的体系结构? :)

定义我们的班级名称:

image

在第一步中,我们将定义班级的名称,因为我们是极具创造力的人,我们将使用班级结束时每个注释的名称,为什么没有人想到以前? :D

    @ArchTest
    static ArchRule ClassesThatHaveControllerAnnotation_MustEndWithControllerName =
            classes()
                    .that().areAnnotatedWith(Controller.class)
                    .should().haveSimpleNameEndingWith("Controller")
            .as("Dear developer, all our classes that are annotated as Controller, must have the name finalized with Controller");

如上所述,使用 Archunit 测试非常简单且非常直观,在我们的测试中,我们告知每个被注释为 Controller 的班级都必须具有名称最终确定为 * Controller *,此外,我们为下一个不按计划的方式提供了一个小费,使用“ .AS(....)”,ISN那太酷了吗? :)

i强迫错误,将我们的班级名称更改为用户约翰,看看发生了什么事:

Image description

之后,我们只是为其他类创建规则,但这是您尝试的:)

如果不能,请不要担心,只需打开项目的GitHub:)

定义我们班级的住所:

image

在第二步中,我们将定义每个类将居住的位置,测试将与上一类非常相似,所以我们去吗? :)

@ArchTest
    static ArchRule ClassesThatHaveControllerAnnotation_MustResideInTheControllerPackage =
            classes()
                    .that().areAnnotatedWith(Controller.class)
                    .should().resideInAPackage("..controller..")
                    .as("Dear developer, all our classes that are annotated as Controller, must reside in the *.controller package");

在上面的示例中,我们告知“ .ResideInaCkage(...)”,这将是我们班级实际居住的地方。

定义哪个课程将调用哪个类:

image

最后,要得出结论,我们需要定义哪个类别的挑战,这样我们就可以控制哪个班级能够知道对方,因为我们将遵循下面的示例:


 @ArchTest
    static final ArchRule ClassesResidingInControllerPackageCannotKnowRepository =
            noClasses().that().resideInAPackage("..controller..")
                    .should().dependOnClassesThat().resideInAPackage("..repository..")
            .as("Repository classes cannot be together with Controller classes :(");

在上面的示例中,我们定义了 Controller 软件包中的任何类都可以取决于存储库中的任何类,不是吗? :D

谢谢大家= D

image

我感谢所有阅读我的文章并陪伴我创建内容的人:)

ArchUnit,拥有出色的文档,在我日常运行的项目中有很多帮助,您如何看待在项目中介绍这一点? :)