首页 > 解决方案 > 使用 jmeter 从 mongodb 中删除记录

问题描述

我正在尝试使用以下代码删除循环中的记录。但它只是删除第一条记录并为其余记录提供成功消息,但它没有反映在 mongo dB 中。

import com.mongodb.*
import com.mongodb.MongoClientSettings;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.conversions.Bson;
import org.bson.types.ObjectId;

import static com.mongodb.client.model.Filters.*;

try{
    MongoCollection<Document> collection=vars.getObject("collection");
    Bson filter=eq("empid","${empid}");

    collection.deleteOne(filter); //delete the document

    return"Document deleted";
}
catch(Exception e){
    SampleResult.setSuccessful(false);
    SampleResult.setResponseCode("500");
    SampleResult.setResponseMessage("Exception: "+e);
}

标签: mongodbjmeter

解决方案


不要将 JMeter 变量内联${empid}到 Groovy 脚本中,因为您使用已编译的脚本缓存功能,只有第一次出现才会在后续调用中使用

根据JSR223 Sampler 文档

JSR223 测试元素具有可以显着提高性能的特性(编译)。要从此功能中受益:

使用脚本文件而不是内联它们。如果此功能在 ScriptEngine 上可用,这将使 JMeter 编译它们并缓存它们。

或使用脚本文本并检查缓存已编译的脚本(如果有可用的属性)。

使用此功能时,请确保您的脚本代码不直接在脚本代码中使用 JMeter 变量或 JMeter 函数调用,因为缓存只会缓存第一个替换。而是使用脚本参数。

所以我相信如果你改变这条线:

Bson filter = eq("empid", "${empid}");

对此:

Bson filter = eq("empid", vars.get("empid"));

您的代码将按预期开始工作。

上面的代码片段vars代表JMeterVariables类实例,请参阅 JavaDoc 获取可用函数列表和您应该在 Groovy 中使用的 8 个 JMeter Java 类,以了解有关可用于 JSR223 测试元素的其他 JMeter API 快捷方式的更多信息


推荐阅读