nodejs异步测试

自从我开发了具有异步行为的服务器端应用程序以来已经有一段时间了,而该行为还不是事件驱动的系统。 异步行为始终是设计和测试中一个有趣的挑战。 通常,异步行为不应该很难进行单元测试–毕竟,动作的行为不一定必须在时间上进行耦合(请参见耦合形式 )。

提示:如果在单元测试中发现需要异步测试,则可能是做错了,需要重新设计代码以消除这些顾虑。

如果您的测试策略仅包括单元测试,那么您将错过一整套行为,而这些行为通常会在集成,功能或系统测试等高级测试中被发现,而这正是我需要异步测试的地方。

从概念上讲,异步测试实际上非常容易。 像同步测试一样,您需要采取措施,然后寻找所需的结果。 但是,与同步测试不同,测试无法保证在检查副作用或结果之前动作已经完成。

通常有两种方法来测试异步行为:

  1. 删除异步行为
  2. 轮询直到您具有所需的状态

删除异步行为

多年前,当TDD对胖客户端应用程序进行TDD时,我仍然使用这种方法,而在swing应用程序中编写应用程序仍然是一种常见的方法。 这样做需要将调用行为的行为隔离在一个地方,而不是在不同的线程中发生,而是在测试过程中在与测试相同的线程中发生。 我什至在2006年对此进行了介绍,并撰写了这份备忘单,介绍了该过程。

这种方法需要一种纪律性的设计方法,在这种情况下,将这种行为切换到一个单独的位置即可。

轮询直到您具有所需的状态

轮询是解决此问题的更为常见的方法,但是这涉及到等待和超时的常见问题。 等待时间过长会增加您的总体测试时间,并会延长反馈循环。 根据您的操作,等待时间太短可能也很昂贵(例如,不必要地锤击某些积分点)。

超时是异步行为的另一种诅咒,因为您实际上不知道何时要执行某项操作,但您实际上并不希望测试永远进行下去。

上一次我不得不做某事时,我们通常会最终编写自己的轮询和超时挂钩,而相对简单的现在可以作为非常简单的库使用。 幸运的是,其他人也在java-land遇到了这个问题,并提供了一个库来帮助简化Awaitility形式的测试 。

这是一个简单的测试,演示了该库使测试异步行为的难易程度:

package com.thekua.spikes.aysnc.testing;import com.thekua.spikes.aysnc.testing.FileGenerator;
import org.junit.Before;
import org.junit.Test;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import static java.util.concurrent.TimeUnit.SECONDS;
import static org.awaitility.Awaitility.await;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertThat;public class FileGeneratorTest {private static final String RESULT_FILE = "target/test/resultFile.txt";private static final String STEP_1_LOG = "target/test/step1.log";private static final String STEP_2_LOG = "target/test/step2.log";private static final String STEP_3_LOG = "target/test/step3.log";private static final List<String> FILES_TO_CLEAN_UP = Arrays.asList(STEP_1_LOG, STEP_2_LOG, STEP_3_LOG, RESULT_FILE);@Beforepublic void setUp() {for (String fileToCleanUp : FILES_TO_CLEAN_UP) {File file = new File(fileToCleanUp);if (file.exists()) {file.delete();}}}@Testpublic void shouldWaitForAFileToBeCreated() throws Exception {// Given I have an aysnc process to runString expectedFile = RESULT_FILE;List<FileGenerator> fileGenerators = Arrays.asList(new FileGenerator(STEP_1_LOG, 1, "Step 1 is complete"),new FileGenerator(STEP_2_LOG, 3, "Step 2 is complete"),new FileGenerator(STEP_3_LOG, 4, "Step 3 is complete"),new FileGenerator(expectedFile, 7, "Process is now complete"));// when it is busy doing its workExecutorService executorService = Executors.newFixedThreadPool(10);for (final FileGenerator fileGenerator : fileGenerators) {executorService.execute(new Runnable() {public void run() {fileGenerator.generate();}});}// then I get some log outputsawait().atMost(2, SECONDS).until(testFileFound(STEP_1_LOG));await().until(testFileFound(STEP_2_LOG));await().until(testFileFound(STEP_3_LOG));// and I should have my final result with the output I expectawait().atMost(10, SECONDS).until(testFileFound(expectedFile));String fileContents = readFile(expectedFile);assertThat(fileContents, startsWith("Process"));// CleanupexecutorService.shutdown();}private String readFile(String expectedFile) throws IOException {return new String(Files.readAllBytes(Paths.get(expectedFile)));}private Callable<Boolean> testFileFound(final String file) {return new Callable<Boolean>() {public Boolean call() throws Exception {return new File(file).exists();}};}
}

您可以在此公共git存储库上浏览完整的演示代码。

翻译自: https://www.javacodegeeks.com/2017/04/automated-tests-asynchronous-processes.html

nodejs异步测试

nodejs异步测试_异步过程的自动化测试相关推荐

  1. 同步等待 异步等待_异步/等待和承诺的解释

    同步等待 异步等待 The async / await operators make it easier to implement many async Promises. They also all ...

  2. 同步等待 异步等待_异步/等待与承诺互操作性

    同步等待 异步等待 Usually, when discussing Promises and async/await syntax, people frame it as an "eith ...

  3. python 异步数据库_异步Python和数据库

    python 异步数据库 The asynchronous programming topic is difficult to cover. These days, it's not just abo ...

  4. 异步重试_异步重试模式

    异步重试 当您有一段经常失败且必须重试的代码时,此Java 7/8库提供了丰富且简洁的API以及针对此问题的快速且可扩展的解决方案: ScheduledExecutorService schedule ...

  5. 异步生成器_异步生成器作为状态管理的替代方法

    异步生成器 Async Generators is a simple but powerful feature that is now a part of JavaScript. It unlocks ...

  6. flask-mail异步发送邮件_异步、定时、邮件任务

    十.异步.定时.邮件任务 1.异步任务 1.创建一个service包 2.创建一个类AsyncService 异步处理还是非常常用的,比如我们在网站上发送邮件,后台会去发送邮件,此时前台会造成响应不动 ...

  7. servlet3异步 例子_异步Servlet示例

    servlet3异步 例子 Async servlet was introduced in Servlet 3. It's a great way to deal with thread starva ...

  8. java jpa 异步编程_异步处理时的JPA

    java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个"企业"类项目都需要JPA与数据库进行通信. JPA是Joel Spolsky描述的" 泄漏抽 ...

  9. 自动化测试(二)01-前端测试分为单元测试、集成测试和E2E测试 测试工具对比-适合TDD或 BDD、断言、异步测试 测试工具的类型

    自动化测试(二)01-前端测试分为单元测试.集成测试和E2E测试 & 测试工具对比-适合TDD或 BDD.断言.异步测试 & 测试工具的类型 前端自动化测试 测试是一个庞大的主题,包括 ...

最新文章

  1. java final bigd_【BigData】Java基础_常量
  2. zookeeper配置中心
  3. awk一些很恐怖的特性
  4. MATALB(三)绘图命令
  5. chrome全屏隐藏状态栏_PS技巧丨18个让你相见恨晚的PS隐藏技巧!
  6. 费纸箱手工制作机器人_环保手工:怎么把纸箱废物利用制作立体小猫(步骤图解)...
  7. 微软 Fluent 设计体系, Fluent UI
  8. feign调用https接口_SpringBoot 2.0 开发案例之整合HTTP客户端Feign
  9. 编写matlab程序设计状态反馈增益阵,利用MATLAB设计状态观测器.pdf
  10. Java Web 2.1.4 HTML 表单标签与表单设计 (实例)
  11. Word,PDF,PPT,TXT之间的转换方法。
  12. 虚拟机的不同网络模式
  13. 基于MATLAB的线性规划:linprog用法
  14. 美团Java后台开发面经
  15. 仓库摆放示意图_仓库货物摆放标准
  16. Android应用之——微信微博第三方sdk登录分享使用过程中的一些常见问题
  17. 滤波电容为什么要靠近放置,去耦半径是什么?滤波电容如何打孔?(转)
  18. 研发人员绩效考核案例
  19. 灰点工业网口相机多相机同时使用
  20. 步数卡路里公里转换Utils

热门文章

  1. 【CF868F】Yet Another Minimization Problem (决策单调性优化dp+分治)
  2. jzoj5248-[NOIP2017提高A组模拟8.10]花花的聚会【倍增,树形dp】
  3. nssl1452-排行榜【数论】
  4. 2018/7/18-纪中某C组题【jzoj3508,jzoj3509,jzoj3510,jzoj3512】
  5. ssl1760-商店选址问题【图论,最短路】
  6. AtCoder Beginner Contest 179 总结
  7. 【动态规划】【递归】取数字问题 (ssl 1644)
  8. 42、Java服务内存OOM原因分析
  9. Spark入门(十)之Distinct去重
  10. Spring Boot面试题(2020最新版)