asp.net 网站开发 ppt怎样做彩票投资网站
2026/4/21 1:16:53 网站建设 项目流程
asp.net 网站开发 ppt,怎样做彩票投资网站,微信wordpress登录,网站引流怎么做6.9 Elasticsearch-单元测试#xff1a;ESSingleNodeTestCase ESIntegTestCase 6.9.1 为什么需要两类测试基类 Elasticsearch 的源码里#xff0c;90 % 的“单元测试”其实都在和磁盘、网络、集群状态打交道。 如果你只想验证一个分词器、一个聚合器或者一个查询解析…6.9 Elasticsearch-单元测试ESSingleNodeTestCase ESIntegTestCase6.9.1 为什么需要两类测试基类Elasticsearch 的源码里90 % 的“单元测试”其实都在和磁盘、网络、集群状态打交道。如果你只想验证一个分词器、一个聚合器或者一个查询解析器启动 35 个节点的集成环境显然太重。如果你要跑通一条跨节点的聚合、快照、CCR、ILM 链路单节点又无法暴露分布式边界带来的 bug。于是官方提供了两条基线ESSingleNodeTestCase——轻量级单进程零网络秒级起停。ESIntegTestCase——重量级内嵌“迷你”集群端口随机可水平扩缩完整走 Transport 层。选对基类可以把单测耗时从 30 s 压到 3 s也能把分布式缺陷在 PR 阶段就暴露出来而不是凌晨 3 点在线上爆炸。6.9.2 ESSingleNodeTestCase 核心机制1. 启动路径BeforeClass→startNode()→ 新建Node实例内部走NodeBuilder与真实启动流程完全一致只是把cluster.name设成随机值并把discovery.type设成single-node。整个生命周期跟随 JUnit 的Suite所有测试方法共用一个Client方法级并行默认关闭避免多个线程同时refresh或flush互相干扰。2. Client 句柄protectedClientclient(){returninternalCluster().client();}返回的是NodeClient请求直接在 JVM 内走TransportService#sendLocalRequest不经过 Netty因此抓包工具看不到任何 9200 端口的流量。3. 索引模板与设置基类会自动把index.number_of_shards固定为 1number_of_replicas为 0避免黄色状态同时禁用merge scheduler的限流让段合并更快完成。如果你的测试依赖自定义分析器在Before里调用createIndex(test,Settings.EMPTY,my_analyzer,/path/to/test_mapping.json);即可一次性把 settings mappings 灌进去。4. 断言工具ESSingleNodeTestCase继承了ESTestCase因此可以直接使用assertHitCount(client().prepareSearch(test).setSize(0).get(), 42L);assertAcked(client().admin().indices().prepareCreate(test2));expectThrows(ElasticsearchException.class, () - client().prepareGet(no, 1).get());5. 典型耗时M1 芯片 SSD 环境下空跑一个测试方法大约 1.2 s其中 70 % 花在 Lucene 的目录锁与快照提交上如果加上 10 万次index请求总耗时 34 s仍比迷你集群快一个数量级。6.9.3 ESIntegTestCase 分布式能力1. 集群拓扑Before→InternalTestCluster#beforeTest()根据cluster.scale随机启动 26 个节点可通过-Dtests.cluster.size固定每个节点独立数据目录、独立Transport端口但共享同一个JVM方便调试。节点之间走MockTransportService内部用ConcurrentHashMap模拟网络因此不会出现端口冲突也不必真的监听 9300。2. 随机化与混沌每次运行会随机轮换以下变量主节点选举时机通过ClusterDisruptionIT注入 100 ms 网络分区。分片分配权重让 3 副本落在 2 节点上触发ShardAllocator重平衡。refresh_interval在-1/1s/100ms之间随机暴露近实时可见性 bug。indices.memory.index_buffer_size从10%到20%抖动验证写队列背压。3. 断网、杀节点、重启internalCluster().stopRandomDataNode();internalCluster().restartRandomDataNode(newInternalTestCluster.RestartCallback(){publicbooleanclearData(StringnodeName){returnrandomBoolean();}});可以模拟磁盘掉盘、节点失联、Master 重新选举等流程配合ClusterServiceUtils#awaitClusterState等待状态收敛。4. 多版本升级测试ESIntegTestCase支持在test资源目录里放置zip格式的旧版本索引测试启动后通过ElasticsearchAssertions#assertIndexExists验证在线迁移。官方RollingUpgradeIT就是基于该能力把 7.17 的索引迁移到 8.x再跑一遍查询对比结果。6.9.4 如何抉择一张速查表场景推荐基类备注写一个新 TokenFilterESSingleNodeTestCase无需分布式只需analyzeAPI验证 Nested 聚合结果ESSingleNodeTestCase数据量 10 万单分片足够测试terms跨分片精度ESIntegTestCase必须 3 分片才能暴露doc_count_error验证 CCR 跟随索引ESIntegTestCase需要 2 集群至少 4 节点快照 repository 异常回滚ESIntegTestCase需要blobStore多节点并发写只想在 5 s 内跑完 CIESSingleNodeTestCase把重型测试放到 nightly 任务6.9.5 常见踩坑与排查清单端口被占用错误日志出现BindTransportException[Address already in use]99 % 是因为前一个测试进程没退干净。解决在 IDEA 的 JUnit 模板里加上-Dtests.cluster.basePort33000-34000让InternalTestCluster每次都随机选段。文件句柄泄漏测试结束后目录删不掉Windows 下尤为明显。解决在After里显式调用IOUtils#rm(tmpDir)并确保Store#close()先于Node#close()否则MMapDirectory的句柄会被复用。时间敏感断言使用assertBusy(() - assertThat(count, equalTo(100L)), 30, TimeUnit.SECONDS)代替固定Thread.sleep避免在慢机器上随机失败。测试数据污染所有索引名、模板名、管道名统一加上test-method级别的随机前缀finalStringindexrandomAlphaOfLength(10).toLowerCase(Locale.ROOT);保证并行执行时不会互相覆盖。Gradle 并行执行使用./gradlew :server:test --tests *ESSingleNodeTestCase*时默认开启maxParallelForks8单节点基类没问题但ESIntegTestCase会抢端口。解决在build.gradle里给integTest任务单独设置maxParallelForks 1或者加TestInstance(Lifecycle.PER_METHOD)隔离。6.9.6 小结ESSingleNodeTestCase 单 JVM 零网络 秒级反馈适合算法、解析、查询计划级别的验证。ESIntegTestCase 多节点 随机拓扑 混沌注入适合分布式一致性、故障恢复、滚动升级。官方 4 万多个测试用例里两者比例约 7 : 3但后者消耗了 80 % 的 CI 时间本地开发阶段优先写单节点 nightly 流水线再补集成。把“快”与“全”分层是 Elasticsearch 能够在保持每日千次提交的同时仍然维持 6 小时之内完成整个 CI 的关键策略之一。推荐阅读PyCharm 2018–2024使用指南更多技术文章见公众号: 大城市小农民

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询