单元测试 - 我应该如何测试这种设计?

2024-01-06

在我的应用程序中,我们的设计有 2 层:API 和操作。

1.运营实现代码的“真实”逻辑,例如:验证用户身份、检索图书信息、通知用户他的图书已被查看。

相同的操作可能被许多 API 使用。

2.APIs由用户执行:接收参数,然后根据API的逻辑执行各种操作。

例如:ViewBookAPI:

class BookApis
{
/**
    * authenticateUserOperation, retreiveBookOperation, informUserBookViewOperation
    * are injected to this class. (Dependency Injection)
*/  
public function viewBookApi($bookId, $accessToken)
{
    $internalUserId = $this->authenticateUserOperation($accessToken);

    $book = $this->retrieveBookOperation($bookId, $internalUserId);

    $this->informUserBookWasViewedOperation($book->getOwnerUserId(), $bookId);

        return $book->getContent();
    }
}

我应该如何测试这个设计?

1.如果我测试 API,那么我必须对使用相同操作的 API 重复相同的测试。

2.如果我测试操作,我所要做的就是验证API是否正确使用操作。

但是如果将错误的对象注入到 API 中怎么办?那时任何测试都不会失败。

非常感谢。


你的设计很常见(理所当然),所以我对这个问题不断出现感到有点惊讶。

您需要进行两种类型的测试:

  1. 集成测试- 确保从 API 调用开始到操作层完成其工作结束的流程正常工作
  2. 单元测试- 测试 API 层以及操作层的每个类

集成测试是非常不言自明的(如果没有,请告诉我,我会详细说明),所以我猜测您指的是单元测试。两个不同的层需要进行不同的测试。

运营层:

在这里,您尝试检查执行实际工作的类是否正在工作。这意味着您应该实例化您正在测试的类,为其提供输入,并检查它提供的输出是否符合您的期望。

假设你有一个这样的类:

public class OperationA {
    public int multiply(int x, int y) {
        return x * y;
    }
}

检查它是否符合您的预期意味着编写一个测试,例如(测试用例本身只是一个示例,不要太认真):

public class OperationATest {
    @Test
    public void testMultiplyZeroByAnyNumberResultsInZero() {
        OperationA op = new OperationA();

        assertEquals(0, op.multiply(0, 0));
        assertEquals(0, op.multiply(10, 0));
        assertEquals(0, op.multiply(-10, 0));
        ...
    }

    @Test
    public void testMultiplyNegativeByNegativeResultsInPositive() {
        ...
    }

    ...
}

API层:

在这里,您尝试检查这些类是否使用操作层中的正确类、以正确的顺序执行正确的操作。为了做到这一点,您应该使用模拟,并使用verify模拟的操作。

假设你有一个这样的类:

public class API_A {

    private OperationA op;

    public API_A(OperationA op) {
        this.op = op;
    }

    public int multiplyTwice(int a, int b, int c) {
        int x = op.multiply(a, b);
        int y = op.multiply(x, c);

        return y;
    }
}

检查它是否符合您的预期意味着(使用 Mockito 语法)编写一个测试,例如:

public class API_A_Test {
    @Test
    public void testMultiplyTwiceMultipliesTheFirstNumberByTheSecondAndThenByTheThird() {
        OperationA op = mock(OperationA.class); 
        when(op.multiply(12, -5)).thenReturn(60);
        API_A api = new API_A(op);

        api.multiply(12, -5, 0);

        verify(op).multiply(12, -5);
        verify(op).multiply(-60, 0);
    }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单元测试 - 我应该如何测试这种设计? 的相关文章

  • 单元测试、集成测试还是设计中的问题?

    我编写了我的第一个单元测试 我认为它过于依赖其他模块 我不确定是否是因为 这是一个复杂的测试 我实际上已经编写了集成测试或 我的设计有问题 我首先要说的是 虽然我有大约 4 年的开发经验 但我从未学过 也没有人教过自动化测试 我刚刚使用 H
  • 测试后 NUnit 回滚

    我对 NUnit 以及一般的自动化测试 还很陌生 我最近做了一些 Ruby On Rails 工作 并注意到在我的测试套件中 当我创建对象 例如新用户 并在套件过程中提交它们时 它们永远不会提交到数据库 以便我可以运行一遍又一遍地测试 不用
  • Jasmin + karma:“错误:模块‘DynamicTestModule’导入了意外的值‘HttpClient’。请添加 @NgModule 注释。”

    我使用 jasmine 作为测试框架 使用 karma 作为测试运行程序 我正在尝试创建一个 HttpClient 对象 以便我可以创建一个服务作为该对象的依赖项 TestBed configureTestingModule declara
  • x86 LargeAddressAware 兼容性的单元测试

    对于 win32 可执行文件 x86 我们可以设置 LargeAddressAware 标志 以便它在 x64 Windows 上运行时可以访问 4 GB 而不是仅 2 GB 的虚拟地址空间 这看起来很吸引人 然而 这也存在风险 例如参见
  • 我应该在单元测试中使用 AutoMapper 吗?

    我正在为 ASP NET MVC 控制器方法编写单元测试 这些控制器依赖于IMapper 我创建的用于抽象 AutoMapper 的接口 使用 Castle Windsor 通过构造函数注入传入 动作方法使用IMapper从领域对象映射到
  • 对于调用另一个异步函数的异步函数,玩笑测试失败

    我正在尝试测试一个使用另一个异步函数返回的数据的异步函数 这是解释我的问题的代码 StudentInfo js export async function getData studentData imported from another
  • 放心 + 模拟 MVC @ControllerAdvice

    在我的项目中 我使用 Rest Assured MockMVC 并具有以下依赖项
  • 如何对使用 Controller.User 变量的控制器操作进行单元测试?

    我有一个控制器操作 如果用户已经登录 它会自动重定向到新页面 User Identity IsAuthenticated 针对这种情况编写单元测试以确保重定向发生的最佳方法是什么 我一直在使用以下 Mocks 和 Moq 来允许在我的单元测
  • 测试随机值 - 对这种方法的想法?

    好的 我一直在研究随机图像选择器和队列系统 因此您不会经常看到相同的图像 一切都很顺利 就我蹩脚的代码而言 until我到了随机位 我想测试一下 但是如何测试呢 没有Debug Assert i IsRandom 可悲的是 D 所以 我在用
  • Django 单元测试数据库没有被拆除?

    我编写了一些单元测试来测试我的 Django 应用程序 特别是一个测试套件中包含大量代码setUp 功能 所述代码的目的是为数据库创建测试数据 是的 我了解固定装置 并且选择在这种情况下不使用它们 当我运行单元测试套件时 运行的第一个测试通
  • 如何模拟 typeORM 的 getCustomRepository

    我想对一个在其构造函数中使用 getCustomRepository 的类进行单元测试 但我只是想不出一种简单的方法来模拟它 这是我的班级代码 import getCustomRepository from typeorm export c
  • EntityTypeConfiguration - 什么是测试数据库映射的干净方法?

    背景 我公司当前的结构是使用 Plinqo Linq to Sql 创建 数据访问对象 然后使用一组自定义的 CodeSmith 模板来构建 业务对象 长话短说 这两组对象紧密耦合 并且使用 Linq to SQL 会导致非常丑陋的解决方法
  • 计算 TCP 重传次数

    我想知道在LINUX中是否有一种方法可以计算一个流中发生的TCP重传的次数 无论是在客户端还是服务器端 好像netstat s解决了我的目的
  • 如何在 Visual Studio 中运行单个测试或特定文件夹中的所有测试?

    因此 我将从带有 ReSharper 的 Visual Studio 2015 迁移到 Visual Studio 2017 并尝试从我的工作流程中删除 ReSharper 我知道 CTRL R T 运行整个 TestClass 或所有测试
  • 如何将Sinon添加到Angular 2测试中?

    我想添加Sinon进行测试 但无法让它运行 我已经安装了 sinon 和 karma sinon 作为 DevDependency 将 sinon 添加到我的 karma 配置文件中的框架中 frameworks jasmine brows
  • 如何在要测试的 React 组件内模拟自定义钩子?

    如果您有一个调用获取数据的自定义挂钩的 React 组件 那么在测试 React 组件时模拟内部自定义挂钩结果的最佳方法是什么 我看到两种主要方法 1 Jest mock 自定义钩子 这似乎是最推荐的方法 但它似乎要求测试对内部实现细节以及
  • 是否可以创建 Java RAM 磁盘以与 java.io.* API 一起使用?

    我正在使用一个第三方库 它基本上创建一个输出目录 其中包含不同类型的文件和子目录 我希望能够编写单元测试来确认输出正确 我希望能够将库与 RAM 磁盘一起使用 这样库所做的任何事情都不会以任何方式接触实际的磁盘板 这个想法是让测试运行和清理
  • 如何让 Mockito 在 androidTest 中工作

    在我的测试中 我如何模拟我编写的课程 这是我的测试代码 import android support test runner AndroidJUnit4 import org junit Before import org junit Te
  • Python unittest - 使用列表断言字典

    在为我的班级编写一些测试时 我遇到了有趣的简单问题 我想断言两个字典包含一些列表 但是这个列表可能不会以相同的方式排序 gt 这会导致测试失败 Example def test myobject export into dictionary
  • RxJava android mvp 单元测试 NullPointerException

    我是 mvp 单元测试的新手 我想对演示者进行一个非常基本的测试 它负责登录 我只想断言 view onLoginSuccess 这是演示者代码 public LoginPresenter LoginViewContract loginVi

随机推荐