nodejs异步测试_异步过程的自动化测试

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异步测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/335223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pipeline python,Python-什么是sklearn.pipeline.Pipeline?

I cant figure out how the sklearn.pipeline.Pipeline works exactly.There are a few explanation in the doc. For example what do they mean by:Pipeline of transforms with a final estimator.To make my question clearer, what are steps? How do they work?EditTha…

devc++鼠标变成了光标_Excel填充别再用鼠标拖拉了!用这4个方法,效率至少高10倍!...

Hello&#xff0c;各位叨友们好呀&#xff01;我是叨叨君~根据下表对照一下自己&#xff0c;在Excel中需要批量填充公式的时候&#xff0c;你是不是还在用鼠标拖拉的方法&#xff0c;将光标放在单元格的右下角&#xff0c;然后按鼠标左键&#xff0c;向下拖动&#xff0c;填充完…

HDR和SDR的区别

概念不同&#xff0c;HDR是指高动态范围图像&#xff0c;SDR是指标准动态范围图像&#xff1b;||亮度范围表现不同&#xff0c;HDR比SDR有更大更亮的数据存储&#xff1b;||图像细节表现不同&#xff0c;HDR技术可以在使图像在明暗之间获取更多的细节表现。 概念不同&#xff…

运动基元_开发人员的新分布式基元

运动基元面向对象的基元&#xff08;进程内基元&#xff09; 作为Java开发人员&#xff0c;我非常熟悉面向对象的概念&#xff0c;例如类&#xff0c;对象&#xff0c;继承&#xff0c;封装&#xff0c;多态性等。除了面向对象的概念之外&#xff0c;我还非常熟悉Java运行时。它…

html5网站 500.19错误,WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事?如何解决?...

WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事&#xff1f;如何解决&#xff1f;作者&#xff1a;兴邦开发部人气&#xff1a;发表时间&#xff1a;2015年05月18日[文章内容简介]&#xff1a;WIN7操作系统创建IIS后浏览时提示HTTP500.19错误是怎么回事&#xff1f;…

python if else 必须同时出现吗,Python:Inline if语句else什么也不做

Assigning a Django Models field to a value if it matches a condition.g Car.objects.get(pk1234)g.data_version my_dict[dataVersion] if my_dict else expression_false # Do nothing??How do I do nothing in that case? We cant do if conditional else pass.I kn…

网络位置可以看到另一个人的电脑_计算机组成原理(一)- 冯·诺依曼体系结构...

1 计算机的基本硬件组成早期,DIY一台计算机&#xff0c;要先有三大件CPU内存主板1.1 CPU计算机最重要的核心配件&#xff0c;中央处理器(Central Processing Unit)。计算机的所有“计算”都是由CPU来进行的。CPU是一个超级精细的印刷电路版1.2 内存(Memory)你撰写的程序、打开的…

vaadin_Vaadin提示:以声明方式构建UI

vaadin如果您使用过GWT&#xff0c;那么您可能会发现UiBinder对于设计复杂的UI很有用。 在有关Vaadin的系列文章中&#xff0c;我们希望在Vaadin和GWT之间得出相似之处。 Vaadin提供了多种开箱即用的工具和组件&#xff0c;用于构建复杂且美观的UI。 其中之一是可以像UiBinder那…

什么是HLG

HLG的全称是Hybrid Log Gamma&#xff0c;它是由英国BBC和日本NHK电视台联合bai开发的高动态范围HDR的一个标准。两国的专业人士通过共同努力&#xff0c;提供了一种在高动态范围的图像采集和制作上都更加容易的方式。 摄像中&#xff0c;HLG和HDR10是HDR的两个常见标准。但HD…

关东升python从小白到大牛_《Python从小白到大牛》第3章 第一个Python程序

本章以HelloWorld作为切入点&#xff0c;介绍如何编写和运行Python程序代码。 运行Python程序主要有两种方式&#xff1a; 1&#xff0e;交互式方式运行 2&#xff0e;文件方式运行 本章介绍这两种运行方式实现HelloWorld程序。 使用Python Shell 进入Python Shell可以通过交互…

计算机知识小技巧,计算机知识---基本操作小技巧.pptx

计算机知识---基本操作小技巧计算机基础操作部门&#xff1a;生管部制作人&#xff1a;邓岳华日期&#xff1a;2017-4-14第一部分&#xff1a;键盘的构造第二部分&#xff1a;基础键的诠释与功能第三部分&#xff1a;组合键的应用Alt Tab 键的使用Alt F4 键的使用Shift Ctrl…

neo4j 显示名字_Neo4j:绘制“我的名字是……我在工作”图

neo4j 显示名字在过去的几天里&#xff0c;我一直在关注DHH发起的有关“我的名字是……”的推文。 据我了解&#xff0c;其想法是表明在白板上编写采访谜语/艰巨任务是荒谬的。 您好&#xff0c;我叫大卫。 我不会在白板上写气泡排序。 我一直在互联网上查找代码。 我不做谜语…

Final Cut Pro x(FCPX)调色笔记

文章目录一、注意点二、调色流程1. 颜色校正&#xff08;一级校色&#xff09;1.1 颜色转换即色彩空间转换1.2 降噪&#xff08;noise reduction 即NR&#xff09;1.3 调整曝光和对比度1.4 调整白平衡1.5 饱和度1.6 肤色调整2.二级校色2.1 突出人物主体的方法一2.2 突出人物主体…

axure web组件下载_实践干货:Axure插入图标的4种办法

编辑导读&#xff1a;图标是我们在制作产品原型的时候使用的比较多的一类素材&#xff0c;在日常绘制原型的时候一般是以插入的形式添加到Axure中。本文作者结合自身经验&#xff0c;介绍了四种Axure中引入图标的方法&#xff0c;希望对大家能有所帮助。在日常绘制原型的时候&a…

上师大计算机学院分数线,分数低还想上师范大学?这4所师范院校,二本的分数就够了...

截至目前&#xff0c;全国各省市高考成绩全部公布了&#xff0c;接下来最主要的工作就是填报志愿&#xff0c;选择适合自己的大学和专业。每年到这个时候&#xff0c;就有不少家长和考生问我&#xff0c;自己的分数较低&#xff0c;不够一本线&#xff0c;有没有比较好的师范大…

上古卷轴3晨风职业_巫师3:上古卷轴5老玩家,入手巫师3,体验昆特牌版“实验室”...

今天小编入手了&#xff0c;期待已久的《巫师3》&#xff0c;而作为一个《上古卷轴5》的“老油条”&#xff0c;奇趣君下面说一下&#xff0c;一个老滚5的“老油条”玩《巫师3》是什么样的体验。首先我进入了开场动画&#xff0c;我没有跳过&#xff0c;而是看着他的剧情&#…

MacBook Mac OS 无法识别移动硬盘的解决办法

文章目录方法一、打开系统信息 System Information方法二、打开磁盘工具 Disk Utility方法一、打开系统信息 System Information 打开「系统信息」&#xff0c;点击左侧硬件列表的 USB&#xff0c;在右侧找到你的移动硬盘点击查看&#xff0c;如下图所示&#xff1a; 然后打开…

java通用对象_有效的Java –所有对象通用的方法

java通用对象所有对象共有的方法&#xff08;第3章&#xff09; 这是Joshua Blochs的有效Java第3章的简短摘要。我仅包含与自己相关的项目。 一般 等值合约将等价关系描述为&#xff1a; x.equals(null) false 自反 – x.equals(x) true 对称 –如果x.equals(y) true则y…

反应速度测试软件,用批处理实现的反应速度测试工具

::此工具在Win7和Vista下请使用管理员身份运行&#xff01;echo offcd.>%windir%\time.logset n:startmode con cols45 lines14Title 反应速度测试工具color 8aset aset bset sset/a n1set t%time:~9,1%cls&echo.&echo.&echo.echo.echo.echo 反应速度测试工具ec…

Mac终端shell类型bash和zsh切换

查看shell类型 可以执行命令echo $SHELL&#xff0c;先查看终端类型。 bash: /bin/bash zsh: /bin/zsh shell类型切换命令 切换到bash 输入命令&#xff1a;chsh -s /bin/bash 切换到zsh 输入命令&#xff1a;chsh -s /bin/zsh 注意需要重启终端生效&#xff08;强制退出后…