jmeter - как я могу сохранить данные из первого запроса и передать их во второй запрос, используя код java - PullRequest
1 голос
/ 02 марта 2020

Я создал простой план тестирования в режиме GUI, он содержит 3 HTTP-запроса и "Create cart" ответ содержит "id" , которые мне нужно передать как параметр пути к запросу «Обновить корзину» .
Я использовал экстрактор JSON для извлечения и сохранения этой переменной, а в режиме GUI все работает просто отлично. Я обращаюсь к переменной через $ {token}

test plan structure
У меня есть проблема - я не знаю, как извлечь, сохранить и получить доступ к сохраненной переменной из java код. Я поиграл с JsonPostProcessor, но, похоже, я его неправильно использую.
Пожалуйста, посмотрите код ниже:

    ...

    HashTree testPlanContainer = new HashTree();

    HeaderManager headerManager = new HeaderManager();
    headerManager.add(new Header("Authorization", "Bearer " + token));
    headerManager.setProperty(TestElement.TEST_CLASS, HeaderManager.class.getName());
    headerManager.setProperty(TestElement.GUI_CLASS, HeaderPanel.class.getName());

    HTTPSampler createCustomer = new HTTPSampler();
    ...set domain, method, body, etc

    HTTPSampler createCart = new HTTPSampler();
    ...set domain, method, body, etc

    JSONPostProcessor jsonPostProcessor = new JSONPostProcessor();
    jsonPostProcessor.setRefNames("cart-id");
    jsonPostProcessor.setJsonPathExpressions("$.id");
    jsonPostProcessor.process();

    HashTree composeCreateCartWithJsonExtractor = new HashTree();
    composeCreateCartWithJsonExtractor.add(createCart, jsonPostProcessor);

    HTTPSampler updateCart = new HTTPSampler();
    updateCart.setPath("path"  + ${cart-id}); //how can I access this variable from java code?
    ... set domain, method, body, etc

    LoopController loopController = new LoopController();
    ... set details

    SetupThreadGroup threadGroup = new SetupThreadGroup();
    ... set details

    TestPlan testPlan = new TestPlan("My test plan");
    ...set details 

    testPlanContainer.add(testPlan);

    HashTree composer = testPlanContainer.add(testPlan, threadGroup);
    composer.add(headerManager);
    composer.add(createCustomer);
    composer.add(composeCreateCartWithJsonExtractor);
    composer.add(updateCart);

    SaveService.saveTree(testPlanContainer, new FileOutputStream("src/main/resources/jmxFile.jmx"));

    Summariser summariser = new Summariser("summaryOfResults");
    ResultCollector resultCollector = new ResultCollector(summariser);
    ...
    testPlanContainer.add(testPlanContainer.getArray()[0], resultCollector);
    ...

Я считаю, что моя ошибка где-то рядом с JsonPostProcessor, возможно, мне следует использовать другой класс или другой способ как извлекать, хранить и вызывать данные из одного запроса в другой. Буду признателен за любой совет

1 Ответ

1 голос
/ 03 марта 2020

Невозможно помочь вам, не увидев вашу реализацию set details, чтобы добавить JSON Extractor как дочерний элемент Sampler, вам нужно добавить оба к HashTree , затем добавьте это HashTree в группу потоков , HashTree, добавьте HashTree группы потоков в План тестирования HashTree, et c.

Пример минимальный рабочий код будет выглядеть примерно так:

// JMeter Test Plan, basically JOrphan HashTree
HashTree testPlanTree = new HashTree();

// First HTTP Sampler - open jsonplaceholder.typicode.com and extract id
HTTPSamplerProxy jsonplaceholderSampler = new HTTPSamplerProxy();
jsonplaceholderSampler.setDomain("jsonplaceholder.typicode.com");
jsonplaceholderSampler.setPort(80);
jsonplaceholderSampler.setPath("/todos/1");
jsonplaceholderSampler.setMethod("GET");
jsonplaceholderSampler.setName("HTTP Request - get id");
jsonplaceholderSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
jsonplaceholderSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());

JSONPostProcessor jsonPostProcessor = new JSONPostProcessor();
jsonPostProcessor.setName("JSON Extractor");
jsonPostProcessor.setProperty("JSONPostProcessor.referenceNames", "cart-id");
jsonPostProcessor.setProperty("JSONPostProcessor.jsonPathExprs", "$.id");
jsonPostProcessor.setProperty(TestElement.TEST_CLASS, JSONPostProcessor.class.getName());
jsonPostProcessor.setProperty(TestElement.GUI_CLASS, JSONPostProcessorGui.class.getName());


// Second HTTP Sampler - open example com
HTTPSamplerProxy exampleComSampler = new HTTPSamplerProxy();
exampleComSampler.setDomain("example.com");
exampleComSampler.setPort(80);
exampleComSampler.setPath("/${cart-id}");
exampleComSampler.setMethod("GET");
exampleComSampler.setName("HTTP Request - send id");
exampleComSampler.setProperty(TestElement.TEST_CLASS, HTTPSamplerProxy.class.getName());
exampleComSampler.setProperty(TestElement.GUI_CLASS, HttpTestSampleGui.class.getName());


// Loop Controller
LoopController loopController = new LoopController();
loopController.setLoops(1);
loopController.setFirst(true);
loopController.setProperty(TestElement.TEST_CLASS, LoopController.class.getName());
loopController.setProperty(TestElement.GUI_CLASS, LoopControlPanel.class.getName());
loopController.initialize();

// Thread Group
ThreadGroup threadGroup = new ThreadGroup();
threadGroup.setName("Example Thread Group");
threadGroup.setNumThreads(1);
threadGroup.setRampUp(1);
threadGroup.setSamplerController(loopController);
threadGroup.setProperty(TestElement.TEST_CLASS, ThreadGroup.class.getName());
threadGroup.setProperty(TestElement.GUI_CLASS, ThreadGroupGui.class.getName());

// Test Plan
TestPlan testPlan = new TestPlan("Create JMeter Script From Java Code");
testPlan.setProperty(TestElement.TEST_CLASS, TestPlan.class.getName());
testPlan.setProperty(TestElement.GUI_CLASS, TestPlanGui.class.getName());
testPlan.setUserDefinedVariables((Arguments) new ArgumentsPanel().createTestElement());

// Construct Test Plan from previously initialized elements
testPlanTree.add(testPlan);
HashTree threadGroupHashTree = testPlanTree.add(testPlan, threadGroup);
HashTree firstSamplerHashTree = new HashTree();
firstSamplerHashTree.add(exampleComSampler);
firstSamplerHashTree.add(jsonplaceholderSampler, jsonPostProcessor);
threadGroupHashTree.add(firstSamplerHashTree);

Извлечение Пять способов запуска теста JMeter без использования статьи JMeter GUI для получения общей информации, вы также можете найти несколько советов и фрагменты кода в разделе комментариев.

Если вам не очень удобно писать код Java с использованием JMeter API , возможно, было бы проще рассмотреть использование инструмента Taurus , который предоставляет возможность строить планы тестирования JMeter программно, используя простой синтаксис YAML .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...