Ошибка неверного токена входа в систему при выполнении сценария, записанного в jmeter - PullRequest
0 голосов
/ 01 мая 2020

Я новичок в Jmeter. Я записал скрипт в jmeter для Moodle.

Записанный сценарий / шаги:

  1. Доступ к приложению Moodle.
  2. Вход в систему с авторизованным пользователем.
  3. Нажмите на ссылку курсов.
  4. Выйти.

Подробности пробного запуска:

Запуск записанного сценария с более чем 50 пользователями, имеющими одинаковые учетные данные пользователя (поскольку приложение поддерживает множественный вход )

Ошибка, допущенная группой мониторинга сервера (во время выполнения сценария jmeter):

invalid Login Token

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

В большинстве случаев вы не можете просто воспроизвести записанный сценарий, современные веб-приложения широко используют динамические c параметры, т.е. отслеживание состояния на стороне клиента или по соображениям безопасности

В случае Moodle вам необходимо передать маркер входа вместе с учетными данными, его можно извлечь из ответа на странице входа в систему, используя, например, CSS Selector Extractor

Демонстрация:

enter image description here

Полный план тестирования на всякий случай:

<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.2.1">
    <hashTree>
        <TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
            <stringProp name="TestPlan.comments"></stringProp>
            <boolProp name="TestPlan.functional_mode">false</boolProp>
            <boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
            <boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
            <elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
                <collectionProp name="Arguments.arguments"/>
            </elementProp>
            <stringProp name="TestPlan.user_define_classpath"></stringProp>
        </TestPlan>
        <hashTree>
            <ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
                <stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
                <elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
                    <boolProp name="LoopController.continue_forever">false</boolProp>
                    <stringProp name="LoopController.loops">1</stringProp>
                </elementProp>
                <stringProp name="ThreadGroup.num_threads">1</stringProp>
                <stringProp name="ThreadGroup.ramp_time">1</stringProp>
                <boolProp name="ThreadGroup.scheduler">false</boolProp>
                <stringProp name="ThreadGroup.duration"></stringProp>
                <stringProp name="ThreadGroup.delay"></stringProp>
                <boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
            </ThreadGroup>
            <hashTree>
                <CookieManager guiclass="CookiePanel" testclass="CookieManager" testname="HTTP Cookie Manager" enabled="true">
                    <collectionProp name="CookieManager.cookies"/>
                    <boolProp name="CookieManager.clearEachIteration">false</boolProp>
                    <boolProp name="CookieManager.controlledByThreadGroup">false</boolProp>
                </CookieManager>
                <hashTree/>
                <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Open Moodle Login Page" enabled="true">
                    <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
                        <collectionProp name="Arguments.arguments"/>
                    </elementProp>
                    <stringProp name="HTTPSampler.domain">sandbox.moodledemo.net</stringProp>
                    <stringProp name="HTTPSampler.port"></stringProp>
                    <stringProp name="HTTPSampler.protocol">https</stringProp>
                    <stringProp name="HTTPSampler.contentEncoding"></stringProp>
                    <stringProp name="HTTPSampler.path">/login/index.php</stringProp>
                    <stringProp name="HTTPSampler.method">GET</stringProp>
                    <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
                    <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
                    <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
                    <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
                    <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
                    <stringProp name="HTTPSampler.connect_timeout"></stringProp>
                    <stringProp name="HTTPSampler.response_timeout"></stringProp>
                </HTTPSamplerProxy>
                <hashTree>
                    <HtmlExtractor guiclass="HtmlExtractorGui" testclass="HtmlExtractor" testname="CSS Selector Extractor" enabled="true">
                        <stringProp name="HtmlExtractor.refname">logintoken</stringProp>
                        <stringProp name="HtmlExtractor.expr">input[name=logintoken]</stringProp>
                        <stringProp name="HtmlExtractor.attribute">value</stringProp>
                        <stringProp name="HtmlExtractor.default"></stringProp>
                        <boolProp name="HtmlExtractor.default_empty_value">false</boolProp>
                        <stringProp name="HtmlExtractor.match_number"></stringProp>
                        <stringProp name="HtmlExtractor.extractor_impl"></stringProp>
                    </HtmlExtractor>
                    <hashTree/>
                </hashTree>
                <HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Perform Login" enabled="true">
                    <elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
                        <collectionProp name="Arguments.arguments">
                            <elementProp name="username" elementType="HTTPArgument">
                                <boolProp name="HTTPArgument.always_encode">false</boolProp>
                                <stringProp name="Argument.value">admin</stringProp>
                                <stringProp name="Argument.metadata">=</stringProp>
                                <boolProp name="HTTPArgument.use_equals">true</boolProp>
                                <stringProp name="Argument.name">username</stringProp>
                            </elementProp>
                            <elementProp name="password" elementType="HTTPArgument">
                                <boolProp name="HTTPArgument.always_encode">false</boolProp>
                                <stringProp name="Argument.value">sandbox</stringProp>
                                <stringProp name="Argument.metadata">=</stringProp>
                                <boolProp name="HTTPArgument.use_equals">true</boolProp>
                                <stringProp name="Argument.name">password</stringProp>
                            </elementProp>
                            <elementProp name="logintoken" elementType="HTTPArgument">
                                <boolProp name="HTTPArgument.always_encode">false</boolProp>
                                <stringProp name="Argument.value">${logintoken}</stringProp>
                                <stringProp name="Argument.metadata">=</stringProp>
                                <boolProp name="HTTPArgument.use_equals">true</boolProp>
                                <stringProp name="Argument.name">logintoken</stringProp>
                            </elementProp>
                            <elementProp name="anchor" elementType="HTTPArgument">
                                <boolProp name="HTTPArgument.always_encode">false</boolProp>
                                <stringProp name="Argument.value"></stringProp>
                                <stringProp name="Argument.metadata">=</stringProp>
                                <boolProp name="HTTPArgument.use_equals">true</boolProp>
                                <stringProp name="Argument.name">anchor</stringProp>
                            </elementProp>
                        </collectionProp>
                    </elementProp>
                    <stringProp name="HTTPSampler.domain">sandbox.moodledemo.net</stringProp>
                    <stringProp name="HTTPSampler.port"></stringProp>
                    <stringProp name="HTTPSampler.protocol">https</stringProp>
                    <stringProp name="HTTPSampler.contentEncoding"></stringProp>
                    <stringProp name="HTTPSampler.path">/login/index.php</stringProp>
                    <stringProp name="HTTPSampler.method">POST</stringProp>
                    <boolProp name="HTTPSampler.follow_redirects">true</boolProp>
                    <boolProp name="HTTPSampler.auto_redirects">false</boolProp>
                    <boolProp name="HTTPSampler.use_keepalive">true</boolProp>
                    <boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
                    <stringProp name="HTTPSampler.embedded_url_re"></stringProp>
                    <stringProp name="HTTPSampler.connect_timeout"></stringProp>
                    <stringProp name="HTTPSampler.response_timeout"></stringProp>
                </HTTPSamplerProxy>
                <hashTree/>
                <ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="View Results Tree" enabled="true">
                    <boolProp name="ResultCollector.error_logging">false</boolProp>
                    <objProp>
                        <name>saveConfig</name>
                        <value class="SampleSaveConfiguration">
                            <time>true</time>
                            <latency>true</latency>
                            <timestamp>true</timestamp>
                            <success>true</success>
                            <label>true</label>
                            <code>true</code>
                            <message>true</message>
                            <threadName>true</threadName>
                            <dataType>true</dataType>
                            <encoding>false</encoding>
                            <assertions>true</assertions>
                            <subresults>true</subresults>
                            <responseData>false</responseData>
                            <samplerData>false</samplerData>
                            <xml>false</xml>
                            <fieldNames>true</fieldNames>
                            <responseHeaders>false</responseHeaders>
                            <requestHeaders>false</requestHeaders>
                            <responseDataOnError>false</responseDataOnError>
                            <saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
                            <assertionsResultsToSave>0</assertionsResultsToSave>
                            <bytes>true</bytes>
                            <sentBytes>true</sentBytes>
                            <url>true</url>
                            <threadCounts>true</threadCounts>
                            <idleTime>true</idleTime>
                            <connectTime>true</connectTime>
                        </value>
                    </objProp>
                    <stringProp name="filename"></stringProp>
                </ResultCollector>
                <hashTree/>
            </hashTree>
        </hashTree>
    </hashTree>
</jmeterTestPlan>
0 голосов
/ 01 мая 2020

Пока вы выполняете скрипт, вы должны совместно связать либо повара ie, либо любой заголовок запроса с токеном. Записанный скрипт не работает, так как каждый раз при входе в систему генерируется новый токен.

Проверьте пройденный заголовок запроса и куки

...