单元测试过多,导致The configured user limit (128) on the number of inotify instances has been reached.
最近在一个asp.net core web项目中使用TDD的方式开发,结果单元测试超过128个之后,在CI中报错了:“The configured user limit (128) on the number of inotify instances has been reached.” 在本地却是正常的,如此诡异的事,必定要搞清楚。
于是,从报错信息着手,一番Google无果之后,不得不冷静思考,报错的原因在哪里?通过异常信息定位到了是因为在测试中,每个测试都要开启一个TestServer,相当于运行一个站点,在站点Setup的时候,需要监听配置文件,在unix系统中是通过一个inotify的东西实现监听的,因此当监听那个配置文件的次数达到系统上限(CI服务器是128)就会抛出一个IO异常,而在本地却没有达到上限,因此是正常的。
既然问题的原因找到了,那么解决问题的思路也就明确了。
方案一:把CI服务器的限制调高
方案二:减少集成测试中开启TestServer的次数
对比这两种方案,第二种是最优解。
一般在跨平台的core中,我们大多使用xunit框架进行测试,在xunit官方文档中,我发现有一节“Shared Context between Tests”,在各个测试中共享一个上下文,大家对上下文的概念应该不陌生,“It is common for unit test classes to share setup and cleanup code (often called "test context"). ”这里是指单元测试中需要共享的启动和清除代码,在我的项目中就是每个测试都需要开启的TestServer(运行asp.net core web站点服务),只要把TestServer放在上下文中就可以在单元测试中共享,不需要每个测试开启一次,那么就会大大减少TestServer的实例个数。
稍微注意一点:在xunit框架中,单元测试默认是Test Collections级别的并发测试,默认一个类算一个Test Collections,那么类与类之间是并发的,而一个类中的所有的单元测试是串行的。当然所有的默认值都能自定义,详见:https://xunit.github.io/docs/running-tests-in-parallel.html
实现我们的解决方案,其实很简单,就是使用xunit中的IClassFixture<>,下面引用一个官方文档中的例子,
public class DatabaseFixture : IDisposable
{
public DatabaseFixture()
{
Db = new SqlConnection("MyConnectionString");
// ... initialize data in the test database ...
}
public void Dispose()
{
// ... clean up test data from the database ...
}
public SqlConnection Db { get; private set; }
}
public class MyDatabaseTests : IClassFixture<DatabaseFixture>
{
DatabaseFixture fixture;
public MyDatabaseTests(DatabaseFixture fixture)
{
this.fixture = fixture;
}
// ... write tests, using fixture.Db to get access to the SQL Server ...
}
在MyDatabaseTests中的所有单元测试都会共享一个DatabaseFixture实例。
然而,在我的项目中,使用了ABP框架,它封装的AbpAspNetCoreIntegratedTestBase<>并不能直接用IClassFixture<>,因此只能把ABP的源码签下来,自己修改一下,然后打包成Nuget包,发布到自己的源中。最后,顺便给ABP提交一个PullRequest
单元测试过多,导致The configured user limit (128) on the number of inotify instances has been reached.的更多相关文章
- .net core 发布linux报错“The configured user limit (128) on the number of inotify instances has been reached”
https://stackoverflow.com/questions/45875981/error-while-reading-json-file-in-dotnet-core-the-config ...
- VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
方案一: sudo vim /etc/sysctl.conf 增加下面内容(环境变量) fs.inotify.max_user_watches = 1638400 fs.inotify.max_use ...
- XCode编译文件过多导致内存吃紧解决方法
XCode编译文件过多导致内存吃紧解决方法 /Users/~~/Library/Developer/Xcode/DerivedData 1) 然后 找到编译文件 删除 就好了哦 快去试试看吧
- [BTS] BizTalk host BizTalkServerApplication throttled because DatabaseSize exceeded the configured throttling limit.
Log Name: ApplicationSource: BizTalk ServerDate: 7/22/2013 6:10:38 PMEvent ID: 7001Task Category: Bi ...
- Linux下php-fpm进程过多导致内存耗尽问题
这篇文章主要介绍了解决Linux下php-fpm进程过多导致内存耗尽问题,需要的朋友可以参考下 最近,发现个人博客的Linux服务器,数据库服务经常挂掉,导致需要重启,才能正常访问,极其恶心,于是 ...
- echarts x轴标签文字过多导致显示不全
原文电梯:https://blog.csdn.net/kebi007/article/details/68488694 echarts x轴标签文字过多导致显示不全 如图: 解决办法1:xAxis.a ...
- 事故记录:php-cgi进程过多导致系统资源耗尽
事故现象:机房一台服务器运行一段时间后,突然发现系统资源即将被耗尽! 1)top命令查看一下系统的cpu ram swap的使用情况 由上图分析,可以看出1--共有602个进程,但其中有601个进程休 ...
- Spark使用CombineTextInputFormat缓解小文件过多导致Task数目过多的问题
目前平台使用Kafka + Flume的方式进行实时数据接入,Kafka中的数据由业务方负责写入,这些数据一部分由Spark Streaming进行流式计算:另一部分数据则经由Flume存储至HDFS ...
- 疑难杂症--在Windows Server 2008 R2上运行SQL Server 2008情况下,CPU过多导致的问题
64位的Windows7和Windows Server 2008 R2为了能够在一台机器上,支持超过64个逻辑CPU, 引入了Processor Group这个概念.Processor Group会把 ...
随机推荐
- Windows上使用Git托管代码到Coding
作者:荒原之梦 Git简介: Git是一款分布式版本控制系统,可用于项目的版本管理.Git可以管理本地代码仓库与远程代码仓库间的连接以及进行版本控制,使得我们可以在本地离线进行修改等操作,之后再将代码 ...
- Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息
[Please make sure to select the branch corresponding to the version of Thymeleaf you are using] Stat ...
- WebJars
WebJarsWebJars是一个很神奇的东西,可以让大家以jar包的形式来使用前端的各种框架.组件. 什么是WebJars 什么是WebJars?WebJars是将客户端(浏览器)资源(JavaSc ...
- JS 总结
加var与不加var的区别: 简单来说就是加了var是局部变量 不加是全局变量.只有加了var的情况下就能限定该变量的使用范围 这样在别的方法里面也可以命名同样的变量了
- Spring Data Jpa 实现分页(Spring MVC+easyui)
spring data jpa很好的对dao层进行了封装,这篇文章主要来写的是实现easyui datagird数据分页,由于各个UI参数不大一样,所以如果使用的是其他UI,得稍作修改.需要说明的是我 ...
- 【深度学习系列】PaddlePaddle垃圾邮件处理实战(一)
PaddlePaddle垃圾邮件处理实战(一) 背景介绍 在我们日常生活中,经常会受到各种垃圾邮件,譬如来自商家的广告.打折促销信息.澳门博彩邮件.理财推广信息等,一般来说邮件客户端都会设置一定的 ...
- vue的常用组件方法应用
项目技术: webpack + vue + element + axois (vue-resource) + less-loader+ ... vue的操作的方法案例: 1.数组数据还未获取到,做出预 ...
- dqname.go
package nsqd func getBackendName(topicName, channelName string) string { // backend names, for u ...
- 一种非常巧妙的读取串口数据的方法--C#
读取不完就一直等待,读完了就立刻走,之前都是设置一个溢出时间,不管是不是早就读取完了都要在这等着,有一定的时间浪费. 注意,用之前要设置好SerialPort类的TimeOut属性:
- Django 基础二(View和urls)
上一篇博文已经成功安装了python环境和Django,并且新建了一个空的项目.接下来就可以正式开始进行Django下 的Web开发了.首先进入项目的主目录: cd ./DjangoLearn/hol ...