false false host ${__P(host,localhost)} = base_path ${__P(base_path,/)} = files_folder ${__P(files_folder,./files/)} = request_protocol ${__P(request_protocol,http)} = admin_password ${__P(admin_password,123123q)} = admin_path ${__P(admin_path,admin)} = admin_user ${__P(admin_user,admin)} = seedForRandom ${__P(seedForRandom,1)} = loops ${__P(loops,1)} = accountManagementPercentage ${__P(accountManagementPercentage,0)} = addToCartByCustomerPercentage ${__P(addToCartByCustomerPercentage,0)} = addToCartByGuestPercentage ${__P(addToCartByGuestPercentage,28)} = addToWishlistPercentage ${__P(addToWishlistPercentage,2)} = adminCMSManagementDelay ${__P(adminCMSManagementDelay,0)} = adminCMSManagementPercentage ${__P(adminCMSManagementPercentage,0)} = adminCategoryCount ${__P(adminCategoryCount,0)} = adminCategoryManagementDelay ${__P(adminCategoryManagementDelay,0)} = adminCategoryManagementPercentage ${__P(adminCategoryManagementPercentage,10)} = adminCreateOrderPercentage ${__P(adminCreateOrderPercentage,70)} = adminCreateProcessReturns ${__P(adminCreateProcessReturns,0)} = adminCreateProcessReturnsDelay ${__P(adminCreateProcessReturnsDelay,0)} = adminCustomerManagementDelay ${__P(adminCustomerManagementDelay,0)} = adminCustomerManagementPercentage ${__P(adminCustomerManagementPercentage,0)} = adminEditOrder ${__P(adminEditOrder,0)} = adminEditOrderPercentage ${__P(adminEditOrderPercentage,15)} = adminEditProduct ${__P(adminEditProduct,0)} = adminImportCustomerBehavior ${__P(adminImportCustomerBehavior,append)} = adminImportCustomerFilePath ${__P(adminImportCustomerFilePath,import_customers/customer_import_addupdate.csv)} = adminImportProductBehavior ${__P(adminImportProductBehavior,append)} = adminImportProductFilePath ${__P(adminImportProductFilePath,import_products/product_import_append_1.csv)} = adminPoolUsers ${__P(adminPoolUsers,1)} = adminProductCreationPercentage ${__P(adminProductCreationPercentage,25)} = adminProductEditingPercentage ${__P(adminProductEditingPercentage,35)} = adminPromotionRulesPercentage ${__P(adminPromotionRulesPercentage,15)} = adminPromotionsManagement ${__P(adminPromotionsManagement,0)} = adminPromotionsManagementDelay ${__P(adminPromotionsManagementDelay,0)} = adminReturnsManagementPercentage ${__P(adminReturnsManagementPercentage,20)} = admin_browse_customer_filter_text ${__P(admin_browse_customer_filter_text,Firstname)} = admin_browse_orders_filter_text ${__P(admin_browse_orders_filter_text,pending)} = admin_browse_product_filter_text ${__P(admin_browse_product_filter_text,Product)} = admin_users_distribution_per_admin_pool ${__P(admin_users_distribution_per_admin_pool,1)} = apiBasePercentage ${__P(apiBasePercentage,0)} = apiOrderInvoiceShipmentSync ${__P(apiOrderInvoiceShipmentSync,0)} = apiPoolUsers ${__P(apiPoolUsers,0)} = apiProcessOrders ${__P(apiProcessOrders,1)} = bamboo_build_number ${__P(bamboo_build_number,)} = browseCatalogByCustomerPercentage ${__P(browseCatalogByCustomerPercentage,0)} = browseCatalogByGuestPercentage ${__P(browseCatalogByGuestPercentage,30)} = browseCustomerGridPercentage ${__P(browseCustomerGridPercentage,10)} = browseOrderGridPercentage ${__P(browseOrderGridPercentage,0)} = browseProductGridPercentage ${__P(browseProductGridPercentage,0)} = cache_hits_percentage ${__P(cache_hits_percentage,100)} = catalogGraphQLPercentage ${__P(catalogGraphQLPercentage,0)} = categories_count ${__P(categories_count,100)} = checkoutByCustomerPercentage ${__P(checkoutByCustomerPercentage,4)} = checkoutByGuestPercentage ${__P(checkoutByGuestPercentage,4)} = compareProductsPercentage ${__P(compareProductsPercentage,2)} = configurable_products_count ${__P(configurable_products_count,15)} = csrPoolUsers ${__P(csrPoolUsers,0)} = customer_checkout_percent ${__P(customer_checkout_percent,100)} = customer_password ${__P(customer_password,123123q)} = customers_page_size ${__P(customers_page_size,100)} = dashboard_enabled ${__P(dashboard_enabled,0)} = deadLocksPoolUsers ${__P(deadLocksPoolUsers,1)} = exportCustomersPercentage ${__P(exportCustomersPercentage,0)} = exportProductsPercentage ${__P(exportProductsPercentage,0)} = form_key ${__P(form_key,uVEW54r8kKday8Wk)} = frontendPoolUsers ${__P(frontendPoolUsers,1)} = guest_checkout_percent ${__P(guest_checkout_percent,100)} = importCustomersPercentage ${__P(importCustomersPercentage,0)} = importProductsPercentage ${__P(importProductsPercentage,0)} = lineItemsAmount ${__P(lineItemsAmount,10)} = orders_page_size ${__P(orders_page_size,20)} = productCompareDelay ${__P(productCompareDelay,0)} = productGridMassActionPercentage ${__P(productGridMassActionPercentage,0)} = products_page_size ${__P(products_page_size,20)} = ramp_period ${__P(ramp_period,0)} = redis_host ${__P(redis_host,)} = report_save_path ${__P(report_save_path,./)} = response_time_file_name ${__P(response_time_file_name,production.csv)} = reviewByCustomerPercentage ${__P(reviewByCustomerPercentage,0)} = reviewDelay ${__P(reviewDelay,0)} = scenario ${__P(scenario,)} = searchAdvancedPercentage ${__P(searchAdvancedPercentage,10)} = searchQuickFilterPercentage ${__P(searchQuickFilterPercentage,30)} = searchQuickPercentage ${__P(searchQuickPercentage,60)} = simple_products_count ${__P(simple_products_count,30)} = siteSearchPercentage ${__P(siteSearchPercentage,30)} = sprint_identifier ${__P(sprint_identifier,)} = start_time ${__P(start_time,${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)})} = starting_index ${__P(starting_index,0)} = think_time_delay_offset ${__P(think_time_delay_offset,2000)} = think_time_deviation ${__P(think_time_deviation,1000)} = url_suffix ${__P(url_suffix,.html)} = website_id ${__P(website_id,1)} = wishlistDelay ${__P(wishlistDelay,0)} = false true true true true true true true false true true false false true false false true false false 0 true true true true mpaf/tool/fragments/ce/view_results_tree.jmx false saveConfig true true true true true true true false true true false false false true false false false true 0 true true true /tmp/aggregate-jmeter-results.jtl mpaf/tool/fragments/ce/aggregate_report.jmx ${host} 60000 200000 ${request_protocol} utf-8 Java 4 mpaf/tool/fragments/ce/http_request_default.jmx Accept-Language en-US,en;q=0.5 Accept application/json,text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept-Encoding gzip, deflate mpaf/tool/fragments/ce/http_header_manager.jmx stoptest false 1 1 1 1384333221000 1384333221000 false mpaf/tool/fragments/ce/setup/setup.jmx 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx props.remove("category_url_key"); props.remove("category_url_keys_list"); props.remove("category_name"); props.remove("category_names_list"); props.remove("simple_products_list"); props.remove("simple_products_list_for_edit"); props.remove("configurable_products_list"); props.remove("configurable_products_list_for_edit"); props.remove("users"); props.remove("customer_emails_list"); /* This is only used when admin is enabled. */ props.put("activeAdminThread", ""); /* Set the environment - at this time '01' or '02' */ String path = "${host}"; String environment = path.substring(4, 6); props.put("environment", environment); false mpaf/tool/fragments/ce/setup/initialize.jmx Boolean stopTestOnError (String error) { log.error(error); System.out.println(error); SampleResult.setStopTest(true); return false; } if ("${host}" == "1") { return stopTestOnError("\"host\" parameter is not defined. Please define host parameter as: \"-Jhost=example.com\""); } String path = "${base_path}"; String slash = "/"; if (!slash.equals(path.substring(path.length() -1)) || !slash.equals(path.substring(0, 1))) { return stopTestOnError("\"base_path\" parameter is invalid. It must start and end with \"/\""); } false mpaf/tool/fragments/ce/setup/validate_user_defined_variables.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path} GET true false true false false Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/setup/login.jmx <title>Dashboard / Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/setup/extract_categories.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} true path = true searchCriteria[filterGroups][0][filters][0][field] true 1/2/% = true searchCriteria[filterGroups][0][filters][0][value] true like = true searchCriteria[filterGroups][0][filters][0][conditionType] true level = true searchCriteria[filterGroups][1][filters][0][field] true 2 = true searchCriteria[filterGroups][1][filters][0][value] true ${categories_count} = true searchCriteria[pageSize] 60000 200000 ${request_protocol} ${base_path}rest/V1/categories/list GET true false false false false false category_url_keys url_key\",\"value\":\"(.*?)\" $1$ -1 false category_names name\":\"(.*?)\" $1$ -1 category_url_keys category_url_key true 1 1 category_url_key_counter false import java.util.ArrayList; // If it is first iteration of cycle then recreate category url key list if (1 == Integer.parseInt(vars.get("category_url_key_counter"))) { categoryUrlKeysList = new ArrayList(); props.put("category_url_keys_list", categoryUrlKeysList); props.put("category_url_key", vars.get("category_url_key")); } else { categoryUrlKeysList = props.get("category_url_keys_list"); } categoryUrlKeysList.add(vars.get("category_url_key")); false category_names category_name true 1 1 category_name_counter false import java.util.ArrayList; // If it is first iteration of cycle then recreate category name list if (1 == Integer.parseInt(vars.get("category_name_counter"))) { categoryNamesList = new ArrayList(); props.put("category_names_list",categoryNamesList); props.put("category_name", vars.get("category_name")); } else { categoryNamesList = props.get("category_names_list"); } categoryNamesList.add(vars.get("category_name")); false props.put("category_url_key", vars.get("category_url_key")); props.put("category_name", vars.get("category_name")); false mpaf/tool/fragments/ce/setup/extract_categories_id_of_last_level.jmx props.remove("admin_category_ids_list"); false Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} true children_count = true searchCriteria[filterGroups][0][filters][0][field] true 0 = true searchCriteria[filterGroups][0][filters][0][value] true level = true searchCriteria[filterGroups][1][filters][0][field] true 2 = true searchCriteria[filterGroups][1][filters][0][value] true gt = true searchCriteria[filterGroups][1][filters][0][conditionType] true ${adminCategoryCount} = true searchCriteria[pageSize] 60000 200000 ${request_protocol} ${base_path}rest/default/V1/categories/list GET true false true false false false category_list_id \{\"id\":(\d+), $1$ -1 category_list_id category_id true import java.util.ArrayList; adminCategoryIdsList = props.get("admin_category_ids_list"); // If it is first iteration of cycle then recreate categories ids list if (adminCategoryIdsList == null) { adminCategoryIdsList = new ArrayList(); props.put("admin_category_ids_list", adminCategoryIdsList); } adminCategoryIdsList.add(vars.get("category_id")); false mpaf/tool/fragments/ce/setup/extract_configurable_products.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} true type_id = true searchCriteria[filterGroups][0][filters][0][field] true configurable = true searchCriteria[filterGroups][0][filters][0][value] true ${configurable_products_count} = true searchCriteria[pageSize] 60000 200000 ${request_protocol} ${base_path}rest/V1/products GET true false true false false false configurable_products_url_keys url_key\",\"value\":\"(.*?)\" $1$ -1 false configurable_product_ids \"id\":(\d+),\"sku\" $1$ -1 false configurable_product_names name\":\"(.*?)\" $1$ -1 false configurable_product_skus sku\":\"(.*?)\" $1$ -1 configurable_product_ids configurable_product_id true 1 1 configurable_products_counter false import java.util.ArrayList; import java.util.HashMap; import org.apache.commons.codec.binary.Base64; // If it is first iteration of cycle then recreate productList if (1 == Integer.parseInt(vars.get("configurable_products_counter"))) { productList = new ArrayList(); props.put("configurable_products_list", productList); } else { productList = props.get("configurable_products_list"); } String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("configurable_products_url_keys_" + vars.get("configurable_products_counter"))+ vars.get("url_suffix"); encodedUrl = Base64.encodeBase64(productUrl.getBytes()); // Create product map Map productMap = new HashMap(); productMap.put("id", vars.get("configurable_product_id")); productMap.put("title", vars.get("configurable_product_names_" + vars.get("configurable_products_counter"))); productMap.put("sku", vars.get("configurable_product_skus_" + vars.get("configurable_products_counter"))); productMap.put("url_key", vars.get("configurable_products_url_keys_" + vars.get("configurable_products_counter"))); productMap.put("uenc", new String(encodedUrl)); // Collect products map in products list productList.add(productMap); false mpaf/tool/fragments/ce/setup/extract_configurable_products_for_edit.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} true type_id = true searchCriteria[filterGroups][0][filters][0][field] true configurable = true searchCriteria[filterGroups][0][filters][0][value] true ${configurable_products_count} = true searchCriteria[pageSize] true 2 = true searchCriteria[currentPage] 60000 200000 ${request_protocol} ${base_path}rest/V1/products GET true false true false false false configurable_products_for_edit_url_keys url_key\",\"value\":\"(.*?)\" $1$ -1 false configurable_product_for_edit_ids \"id\":(\d+),\"sku\" $1$ -1 false configurable_product_for_edit_names name\":\"(.*?)\" $1$ -1 false configurable_product_for_edit_skus sku\":\"(.*?)\" $1$ -1 configurable_product_for_edit_ids configurable_product_for_edit_id true 1 1 configurable_products_counter_for_edit false import java.util.ArrayList; import java.util.HashMap; import org.apache.commons.codec.binary.Base64; if (1 == Integer.parseInt(vars.get("configurable_products_counter_for_edit"))) { editProductList = new ArrayList(); props.put("configurable_products_list_for_edit", editProductList); } else { productList = props.get("configurable_products_list_for_edit"); } String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("configurable_products_for_edit_url_keys_" + vars.get("configurable_products_counter_for_edit"))+ vars.get("url_suffix"); encodedUrl = Base64.encodeBase64(productUrl.getBytes()); // Create product map Map editProductMap = new HashMap(); editProductMap.put("id", vars.get("configurable_product_for_edit_id")); editProductMap.put("title", vars.get("configurable_product_for_edit_names_" + vars.get("configurable_products_counter_for_edit"))); editProductMap.put("sku", vars.get("configurable_product_for_edit_skus_" + vars.get("configurable_products_counter_for_edit"))); editProductMap.put("url_key", vars.get("configurable_products_for_edit_url_keys_" + vars.get("configurable_products_counter_for_edit"))); editProductMap.put("uenc", new String(encodedUrl)); // Collect products map in products list editProductList.add(editProductMap); false mpaf/tool/fragments/ce/setup/extract_simple_products_for_edit.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} true type_id = true searchCriteria[filterGroups][0][filters][0][field] true simple = true searchCriteria[filterGroups][0][filters][0][value] true ${simple_products_count} = true searchCriteria[pageSize] true 1 = true searchCriteria[currentPage] true attribute_set_id = true searchCriteria[filterGroups][1][filters][1][field] true 4 = true searchCriteria[filterGroups][1][filters][1][value] 60000 200000 ${request_protocol} ${base_path}rest/V1/products GET true false true false false false simple_products_for_edit_url_keys url_key\",\"value\":\"(.*?)\" $1$ -1 false simple_product_for_edit_ids \"id\":(\d+),\"sku\" $1$ -1 false simple_product_for_edit_names name\":\"(.*?)\" $1$ -1 false simple_product_for_edit_skus sku\":\"(.*?)\" $1$ -1 simple_product_for_edit_ids simple_product_for_edit_id true 1 1 simple_products_counter_for_edit false import java.util.ArrayList; import java.util.HashMap; import org.apache.commons.codec.binary.Base64; if (1 == Integer.parseInt(vars.get("simple_products_counter_for_edit"))) { editProductList = new ArrayList(); props.put("simple_products_list_for_edit", editProductList); } else { productList = props.get("simple_products_counter_for_edit"); } String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("simple_products_for_edit_url_keys_" + vars.get("simple_products_counter_for_edit"))+ vars.get("url_suffix"); encodedUrl = Base64.encodeBase64(productUrl.getBytes()); // Create product map Map editProductMap = new HashMap(); editProductMap.put("id", vars.get("simple_product_for_edit_id")); editProductMap.put("title", vars.get("simple_product_for_edit_names_" + vars.get("simple_products_counter_for_edit"))); editProductMap.put("sku", vars.get("simple_product_for_edit_skus_" + vars.get("simple_products_counter_for_edit"))); editProductMap.put("url_key", vars.get("simple_products_for_edit_url_keys_" + vars.get("simple_products_counter_for_edit"))); editProductMap.put("uenc", new String(encodedUrl)); // Collect products map in products list editProductList.add(editProductMap); false mpaf/tool/fragments/ce/setup/extract_simple_products.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} true type_id = true searchCriteria[filterGroups][0][filters][0][field] true simple = true searchCriteria[filterGroups][0][filters][0][value] true ${simple_products_count} = true searchCriteria[pageSize] true attribute_set_id != true searchCriteria[filterGroups][0][filters][1][field] true 4 = true searchCriteria[filterGroups][0][filters][1][value] 60000 200000 ${request_protocol} ${base_path}rest/V1/products GET true false true false false false simple_products_url_keys url_key\",\"value\":\"(.*?)\" $1$ -1 false simple_product_ids \"id\":(\d+),\"sku\" $1$ -1 false simple_product_names name\":\"(.*?)\" $1$ -1 false simple_product_skus sku\":\"(.*?)\" $1$ -1 simple_product_ids simple_product_id true 1 1 simple_products_counter false import java.util.ArrayList; import java.util.HashMap; import org.apache.commons.codec.binary.Base64; // If it is first iteration of cycle then recreate productList if (1 == Integer.parseInt(vars.get("simple_products_counter"))) { productList = new ArrayList(); props.put("simple_products_list", productList); } else { productList = props.get("simple_products_list"); } String productUrl = vars.get("request_protocol") + "://" + vars.get("host") + vars.get("base_path") + vars.get("simple_products_url_keys_" + vars.get("simple_products_counter"))+ vars.get("url_suffix"); encodedUrl = Base64.encodeBase64(productUrl.getBytes()); // Create product map Map productMap = new HashMap(); productMap.put("id", vars.get("simple_product_id")); productMap.put("title", vars.get("simple_product_names_" + vars.get("simple_products_counter"))); productMap.put("sku", vars.get("simple_product_skus_" + vars.get("simple_products_counter"))); productMap.put("url_key", vars.get("simple_products_url_keys_" + vars.get("simple_products_counter"))); productMap.put("uenc", new String(encodedUrl)); // Collect products map in products list productList.add(productMap); false mpaf/tool/fragments/ce/setup/extract_admin_users.jmx false ${admin_form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/user/roleGrid/limit/200/?ajax=true&isAjax=true POST true false true false false false import java.util.regex.Pattern; import java.util.regex.Matcher; import java.util.LinkedList; LinkedList adminUserList = new LinkedList(); String response = new String(data); Pattern pattern = Pattern.compile("<td\\W*?data-column=.username[^>]*?>\\W*?(\\w+)\\W*?<"); Matcher matcher = pattern.matcher(response); while (matcher.find()) { adminUserList.add(matcher.group(1)); } adminUserList.poll(); props.put("adminUserList", adminUserList); props.put("adminUserListIterator", adminUserList.descendingIterator()); mpaf/tool/fragments/ce/setup/extract_customers.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/customer/index/ GET true false true false false true import org.apache.jmeter.protocol.http.control.CookieManager; import org.apache.jmeter.protocol.http.control.Cookie; CookieManager manager = sampler.getCookieManager(); Cookie cookie = new Cookie("adminhtml",vars.get("COOKIE_adminhtml"),vars.get("host"),"/",false,0); manager.add(cookie); Customers <title>Customers / Customers / Magento Admin</title> Assertion.response_data false 2 true customer_listing = true namespace true entity_id = true sorting[field] true asc = true sorting[direction] true true = true isAjax true customer_since[locale]=en_US = true filters[placeholder] true 1 = true filters[group_id] true 1 = true filters[website_id] true ${customers_page_size} = true paging[pageSize] true 1 = true paging[current] true entity_id = true sorting[field] true asc = true sorting[direction] true true = true isAjax 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false $.totalRecords 0 true false true true customer_emails $.items[*].email BODY customer_ids $.items[*].entity_id BODY false import java.util.LinkedList; LinkedList emailsList = new LinkedList(); props.put("customer_emails_list", emailsList); customer_emails customer_email true 1 1 email_counter false try { props.get("customer_emails_list").add(vars.get("customer_email")); } catch (java.lang.Exception e) { log.error("error…", e); SampleResult.setStopThread(true); } false customer_ids customer_id true 1 1 id_counter false import java.util.ArrayList; // If it is first iteration of cycle then recreate idsList if (1 == Integer.parseInt(vars.get("id_counter"))) { idsList = new ArrayList(); props.put("customer_ids_list", idsList); } else { idsList = props.get("customer_ids_list"); } idsList.add(vars.get("customer_id")); false mpaf/tool/fragments/ce/setup/extract_region_ids.jmx false US = true parent ${request_protocol} ${base_path}${admin_path}/directory/json/countryRegion/ GET true false true false false groovy import groovy.json.JsonSlurper def jsonSlurper = new JsonSlurper(); def regionResponse = jsonSlurper.parseText(prev.getResponseDataAsString()); regionResponse.each { region -> if (region.label.toString() == "Alabama") { props.put("alabama_region_id", region.value.toString()); } else if (region.label.toString() == 'California') { props.put("california_region_id", region.value.toString()); } } Boolean stopTestOnError (String error) { log.error(error); System.out.println(error); SampleResult.setStopTest(true); return false; } if (props.get("simple_products_list") == null) { return stopTestOnError("Cannot find simple products. Test stopped."); } if (props.get("simple_products_list_for_edit") == null) { return stopTestOnError("Cannot find simple products for edit. Test stopped."); } if (props.get("configurable_products_list") == null) { return stopTestOnError("Cannot find configurable products. Test stopped."); } if (props.get("configurable_products_list_for_edit") == null) { return stopTestOnError("Cannot find configurable products for edit. Test stopped."); } if (props.get("customer_emails_list") == null) { return stopTestOnError("Cannot find customer emails. Test stopped."); } if (props.get("category_url_keys_list") == null) { return stopTestOnError("Cannot find category url keys. Test stopped."); } if (props.get("category_names_list") == null) { return stopTestOnError("Cannot find category names. Test stopped."); } false mpaf/tool/fragments/ce/setup/validate_properties.jmx true 1 = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add POST true false true false false mpaf/tool/fragments/ce/setup/warmup_add_to_cart.jmx false ["customer_form_login"] = true blocks false ["default","customer_account_login"] = true handles false {"route":"customer","controller":"account","action":"login","uri":"/customer/account/login/"} = true originalRequest true true = true ajax true true = true isAjax 60000 200000 ${request_protocol} ${base_path}page_cache/block/render/ GET true false true false false mpaf/tool/fragments/ce/setup/ajax_load_login_form.jmx "customer_form_login" Registered Customers form_key Assertion.response_data false 2 continue false ${loops} ${frontendPoolUsers} ${ramp_period} 1505803944000 1505803944000 false mpaf/tool/fragments/_system/thread_group.jmx javascript var cacheHitPercent = vars.get("cache_hits_percentage"); if ( cacheHitPercent < 100 && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { doCache(); } function doCache(){ var random = Math.random() * 100; if (cacheHitPercent < random) { sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); } } mpaf/tool/fragments/ce/common/cache_hit_miss.jmx 1 false 1 ${browseCatalogByCustomerPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Catalog Browsing By Customer"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("category_url_keys_list").size()); vars.put("category_url_key", props.get("category_url_keys_list").get(number)); vars.put("category_name", props.get("category_names_list").get(number)); false mpaf/tool/fragments/ce/common/extract_category_setup.jmx get-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_customer_email.jmx customerUserList = props.get("customer_emails_list"); customerUser = customerUserList.poll(); if (customerUser == null) { SampleResult.setResponseMessage("customernUser list is empty"); SampleResult.setResponseData("customerUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("customer_email", customerUser); true 60000 200000 ${request_protocol} ${base_path}customer/account/login/ GET true false true false false mpaf/tool/fragments/ce/common/open_login_page.jmx <title>Customer Login</title> Assertion.response_data false 2 true ${form_key} = true form_key true ${customer_email} = true login[username] true ${customer_password} = true login[password] true = true send 60000 200000 ${request_protocol} ${base_path}customer/account/loginPost/ POST true false true false false mpaf/tool/fragments/ce/common/login.jmx <title>My Account</title> Assertion.response_data false 2 false addressId customer/address/edit/id/([^'"]+)/ $1$ 1 ^.+$ Assertion.response_data false 1 variable addressId true = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${category_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/common/open_category.jmx <span class="base" data-ui-id="page-title">${category_name}</span> Assertion.response_data false 6 false category_id <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> $1$ 1 simple_product_1_url_key ^[0-9]+$ Assertion.response_data false 1 variable category_id true 2 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("configurable_products_list").size()); product = props.get("configurable_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}customer/account/logout/ GET true false true false false mpaf/tool/fragments/ce/common/logout.jmx You are signed out. Assertion.response_data false 2 false customerUserList = props.get("customer_emails_list"); customerUserList.add(vars.get("customer_email")); mpaf/tool/fragments/ce/common/return_email_to_pool.jmx 1 false 1 ${browseCatalogByGuestPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Catalog Browsing By Guest"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("category_url_keys_list").size()); vars.put("category_url_key", props.get("category_url_keys_list").get(number)); vars.put("category_name", props.get("category_names_list").get(number)); false mpaf/tool/fragments/ce/common/extract_category_setup.jmx 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${category_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/common/open_category.jmx <span class="base" data-ui-id="page-title">${category_name}</span> Assertion.response_data false 6 false category_id <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> $1$ 1 simple_product_1_url_key ^[0-9]+$ Assertion.response_data false 1 variable category_id true 2 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("configurable_products_list").size()); product = props.get("configurable_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 1 false 1 ${siteSearchPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Site Search"); true ${files_folder}search_terms.csv UTF-8 , false true false shareMode.thread mpaf/tool/fragments/ce/search/search_terms.jmx javascript var cacheHitPercent = vars.get("cache_hits_percentage"); if ( cacheHitPercent < 100 && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { doCache(); } function doCache(){ var random = Math.random() * 100; if (cacheHitPercent < random) { sampler.setPath(sampler.getPath() + "?cacheModifier=" + Math.random().toString(36).substring(2, 13)); } } mpaf/tool/fragments/ce/common/cache_hit_miss.jmx 1 false 1 ${searchQuickPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Quick Search"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 true q ${searchTerm} = true 60000 200000 ${request_protocol} ${base_path}catalogsearch/result/ GET true false true false false mpaf/tool/fragments/ce/search/search_quick.jmx Search results for: <span class="toolbar-number">\d<\/span> Items|Items <span class="toolbar-number">1 Assertion.response_data false 2 false product_url_keys <a class="product-item-link"(?s).+?href="(?:http|https)://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). $2$ -1 false isPageCacheable catalogsearch/searchTermsLog/save $0$ 0 1 "${isPageCacheable}" != "0" false mpaf/tool/fragments/ce/search/if_page_cacheable_controller.jmx true q ${searchTerm} = true 60000 200000 ${request_protocol} ${base_path}catalogsearch/searchTermsLog/save/ GET true false true false false mpaf/tool/fragments/ce/search/search_terms_log_save.jmx "success":true Assertion.response_data false 2 foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); if (foundProducts > 3) { foundProducts = 3; } vars.put("foundProducts", String.valueOf(foundProducts)); true mpaf/tool/fragments/ce/search/set_found_items.jmx true ${foundProducts} mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true mpaf/tool/fragments/ce/search/searched_products_setup.jmx number = vars.get("_counter"); product = vars.get("product_url_keys_"+number); vars.put("product_url_key", product); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 1 false 1 ${searchQuickFilterPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Quick Search With Filtration"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 true q ${searchTerm} = true 60000 200000 ${base_path}catalogsearch/result/ GET true false true false false mpaf/tool/fragments/ce/search/search_quick_filter.jmx Search results for: Items <span class="toolbar-number">1 Assertion.response_data false 2 0 attribute_1_options_count count((//div[@class="filter-options-content"])[1]//li[@class="item"]) false true false 0 attribute_2_options_count count((//div[@class="filter-options-content"])[2]//li[@class="item"]) false true false attribute_1_filter_url ((//div[@class="filter-options-content"])[1]//li[@class="item"]//a)[1]/@href false true false false product_url_keys <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). $2$ -1 false isPageCacheable catalogsearch/searchTermsLog/save $0$ 0 1 "${isPageCacheable}" != "0" false mpaf/tool/fragments/ce/search/if_page_cacheable_controller.jmx true q ${searchTerm} = true 60000 200000 ${request_protocol} ${base_path}catalogsearch/searchTermsLog/save/ GET true false true false false mpaf/tool/fragments/ce/search/search_terms_log_save.jmx "success":true Assertion.response_data false 2 ${attribute_1_options_count} > 0 false mpaf/tool/fragments/ce/search/search_quick_filter-first-attribute.jmx vars.put("search_url", vars.get("attribute_1_filter_url")); false 60000 200000 ${attribute_1_filter_url} GET true false true false false Search results for: <span class="toolbar-number">[1-9]+ Assertion.response_data false 2 0 attribute_2_options_count count((//div[@class="filter-options-content"])[2]//li[@class="item"]) false true false attribute_2_filter_url ((//div[@class="filter-options-content"])[2]//li[@class="item"]//a)[1]/@href false true false false product_url_keys <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). $2$ -1 ${attribute_2_options_count} > 0 false mpaf/tool/fragments/ce/search/search_quick_filter-second-attribute.jmx vars.put("search_url", vars.get("attribute_2_filter_url")); false 60000 200000 ${attribute_2_filter_url} GET true false true false false Search results for: <span class="toolbar-number">[1-9]+ Assertion.response_data false 2 false product_url_keys <a class="product-item-link"(?s).+?href="http://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). $2$ -1 foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); if (foundProducts > 3) { foundProducts = 3; } vars.put("foundProducts", String.valueOf(foundProducts)); true mpaf/tool/fragments/ce/search/set_found_items.jmx true ${foundProducts} mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true mpaf/tool/fragments/ce/search/searched_products_setup.jmx number = vars.get("_counter"); product = vars.get("product_url_keys_"+number); vars.put("product_url_key", product); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 1 false 1 ${searchAdvancedPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Advanced Search"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${base_path}catalogsearch/advanced/ GET true false true false false mpaf/tool/fragments/ce/search/open_advanced_search_page.jmx <title>Advanced Search</title> Assertion.response_data false 2 attribute_name (//select[@class="multiselect"])[last()]/@name false true false 0 attribute_options_count count((//select[@class="multiselect"])[last()]/option) false true false attribute_value ((//select[@class="multiselect"])[last()]/option)[1]/@value false true false true name = true true sku = true true description ${searchTerm} = true true short_description = true true price%5Bfrom%5D = true true price%5Bto%5D ${priceTo} = true 60000 200000 ${request_protocol} ${base_path}catalogsearch/advanced/result/ GET true false true false false mpaf/tool/fragments/ce/search/search_advanced.jmx items</strong> were found using the following search criteria Assertion.response_data false 2 false product_url_keys <a class="product-item-link"(?s).+?href="(?:http|https)://${host}${base_path}(index.php/)?([^'"]+)${url_suffix}">(?s). $2$ -1 foundProducts = Integer.parseInt(vars.get("product_url_keys_matchNr")); if (foundProducts > 3) { foundProducts = 3; } vars.put("foundProducts", String.valueOf(foundProducts)); true mpaf/tool/fragments/ce/search/set_found_items.jmx true ${foundProducts} mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true mpaf/tool/fragments/ce/search/searched_products_setup.jmx number = vars.get("_counter"); product = vars.get("product_url_keys_"+number); vars.put("product_url_key", product); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 1 false 1 ${addToCartByGuestPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Add To Cart By Guest"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true mpaf/tool/fragments/ce/common/init_total_products_in_cart_setup.jmx vars.put("totalProductsAdded", "0"); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("category_url_keys_list").size()); vars.put("category_url_key", props.get("category_url_keys_list").get(number)); vars.put("category_name", props.get("category_names_list").get(number)); false mpaf/tool/fragments/ce/common/extract_category_setup.jmx 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${category_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/common/open_category.jmx <span class="base" data-ui-id="page-title">${category_name}</span> Assertion.response_data false 6 false category_id <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> $1$ 1 simple_product_1_url_key ^[0-9]+$ Assertion.response_data false 1 variable category_id true 2 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("configurable_products_list").size()); product = props.get("configurable_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true 1 mpaf/tool/fragments/ce/common/get_configurable_product_options.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} 60000 200000 ${request_protocol} ${base_path}rest/V1/configurable-products/${product_sku}/options/all GET true false true false false attribute_ids $.[*].attribute_id NO_VALUE BODY option_values $.[*].values[0].value_index NO_VALUE BODY true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx false try { attribute_ids = vars.get("attribute_ids"); option_values = vars.get("option_values"); attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); option_values = option_values.replace("[","").replace("]","").replace("\"", ""); attribute_ids_array = attribute_ids.split(","); option_values_array = option_values.split(","); args = ctx.getCurrentSampler().getArguments(); it = args.iterator(); while (it.hasNext()) { argument = it.next(); if (argument.getStringValue().contains("${")) { args.removeArgument(argument.getName()); } } for (int i = 0; i < attribute_ids_array.length; i++) { ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); } } catch (Exception e) { log.error("eror…", e); } mpaf/tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx 1 false 1 ${addToWishlistPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Add to Wishlist"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true get-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_customer_email.jmx customerUserList = props.get("customer_emails_list"); customerUser = customerUserList.poll(); if (customerUser == null) { SampleResult.setResponseMessage("customernUser list is empty"); SampleResult.setResponseData("customerUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("customer_email", customerUser); true 60000 200000 ${request_protocol} ${base_path}customer/account/login/ GET true false true false false mpaf/tool/fragments/ce/common/open_login_page.jmx <title>Customer Login</title> Assertion.response_data false 2 true ${form_key} = true form_key true ${customer_email} = true login[username] true ${customer_password} = true login[password] true = true send 60000 200000 ${request_protocol} ${base_path}customer/account/loginPost/ POST true false true false false mpaf/tool/fragments/ce/common/login.jmx <title>My Account</title> Assertion.response_data false 2 false addressId customer/address/edit/id/([^'"]+)/ $1$ 1 ^.+$ Assertion.response_data false 1 variable addressId true = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false true 5 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${form_key} = true form_key false true ${product_uenc} = true uenc true ${product_id} = true product 60000 200000 ${request_protocol} ${base_path}wishlist/index/add/ POST true false true false false mpaf/tool/fragments/ce/wishlist/add_to_wishlist.jmx <title>My Wish List</title> Assertion.response_data false 16 false wishListItems data-post-remove='\{"action":"(.+)\/wishlist\\/index\\/remove\\/","data":\{"item":"([^"]+)" $2$ -1 true wishlist,messages = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/wishlist/load_wishlist_section.jmx {"wishlist":{"counter":" Assertion.response_data false 16 ${wishlistDelay}*1000 wishListItems wishListItem true mpaf/tool/fragments/ce/wishlist/clear_wishlist.jmx 1 5 1 counter true true true ${form_key} = true form_key true true ${wishListItem} = true item true 60000 200000 ${request_protocol} ${base_path}wishlist/index/remove/ POST true false true false false 60000 200000 ${request_protocol} ${base_path}customer/account/logout/ GET true false true false false mpaf/tool/fragments/ce/common/logout.jmx You are signed out. Assertion.response_data false 2 false customerUserList = props.get("customer_emails_list"); customerUserList.add(vars.get("customer_email")); mpaf/tool/fragments/ce/common/return_email_to_pool.jmx 1 false 1 ${compareProductsPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Compare Products"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true mpaf/tool/fragments/ce/common/init_total_products_in_cart_setup.jmx vars.put("totalProductsAdded", "0"); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("category_url_keys_list").size()); vars.put("category_url_key", props.get("category_url_keys_list").get(number)); vars.put("category_name", props.get("category_names_list").get(number)); false mpaf/tool/fragments/ce/common/extract_category_setup.jmx 60000 200000 ${request_protocol} ${base_path}${category_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_compare/open_category.jmx <span class="base" data-ui-id="page-title">${category_name}</span> Assertion.response_data false 6 false random_product_compare_id catalog\\/product_compare\\/add\\/\",\"data\":\{\"product\":\"([0-9]+)\" $1$ 1 ^[0-9]+$ Assertion.response_data false 1 variable random_product_compare_id true 2 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${product_id} = true product true ${form_key} = true form_key true ${product_uenc} = true uenc 60000 200000 ${request_protocol} ${base_path}catalog/product_compare/add/ POST true false true false false mpaf/tool/fragments/ce/product_compare/product_compare_add.jmx true compare-products,messages = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/product_compare/customer_section_load_product_compare_add.jmx \"compare-products\":{\"count\":${totalProductsAdded} Assertion.response_data false 2 true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("configurable_products_list").size()); product = props.get("configurable_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${product_id} = true product true ${form_key} = true form_key true ${product_uenc} = true uenc 60000 200000 ${request_protocol} ${base_path}catalog/product_compare/add/ POST true false true false false mpaf/tool/fragments/ce/product_compare/product_compare_add.jmx true compare-products,messages = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/product_compare/customer_section_load_product_compare_add.jmx \"compare-products\":{\"count\":${totalProductsAdded} Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}catalog/product_compare/index/ GET true false true false false mpaf/tool/fragments/ce/product_compare/compare_products.jmx 1 0 ${__javaScript(Math.round(${productCompareDelay}*1000))} mpaf/tool/fragments/ce/product_compare/compare_products_pause.jmx true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}catalog/product_compare/clear POST true false true false false mpaf/tool/fragments/ce/product_compare/compare_products_clear.jmx 1 false 1 ${checkoutByGuestPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Checkout By Guest"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true mpaf/tool/fragments/ce/common/init_total_products_in_cart_setup.jmx vars.put("totalProductsAdded", "0"); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("category_url_keys_list").size()); vars.put("category_url_key", props.get("category_url_keys_list").get(number)); vars.put("category_name", props.get("category_names_list").get(number)); false mpaf/tool/fragments/ce/common/extract_category_setup.jmx 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${category_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/common/open_category.jmx <span class="base" data-ui-id="page-title">${category_name}</span> Assertion.response_data false 6 false category_id <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> $1$ 1 simple_product_1_url_key ^[0-9]+$ Assertion.response_data false 1 variable category_id true 2 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("configurable_products_list").size()); product = props.get("configurable_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true 1 mpaf/tool/fragments/ce/common/get_configurable_product_options.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} 60000 200000 ${request_protocol} ${base_path}rest/V1/configurable-products/${product_sku}/options/all GET true false true false false attribute_ids $.[*].attribute_id NO_VALUE BODY option_values $.[*].values[0].value_index NO_VALUE BODY true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx false try { attribute_ids = vars.get("attribute_ids"); option_values = vars.get("option_values"); attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); option_values = option_values.replace("[","").replace("]","").replace("\"", ""); attribute_ids_array = attribute_ids.split(","); option_values_array = option_values.split(","); args = ctx.getCurrentSampler().getArguments(); it = args.iterator(); while (it.hasNext()) { argument = it.next(); if (argument.getStringValue().contains("${")) { args.removeArgument(argument.getName()); } } for (int i = 0; i < attribute_ids_array.length; i++) { ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); } } catch (Exception e) { log.error("eror…", e); } mpaf/tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx mpaf/tool/fragments/ce/simple_controller.jmx javascript vars.put("alabama_region_id", props.get("alabama_region_id")); vars.put("california_region_id", props.get("california_region_id")); mpaf/tool/fragments/ce/common/get_region_data.jmx 60000 200000 ${request_protocol} ${base_path}checkout/ GET true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_start.jmx <title>Checkout</title> Assertion.response_data false 2 <title>Shopping Cart</title> Assertion.response_data false 6 false cart_id "quoteData":{"entity_id":"([^'"]+)", $1$ 1 ^.+$ Assertion.response_data false 1 variable cart_id true false {"customerEmail":"test@example.com"} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/customers/isEmailAvailable POST true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_email_available.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json true Assertion.response_data false 8 true false {"address":{"country_id":"US","postcode":"95630"}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods POST true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json "available":true Assertion.response_data false 2 true false {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information POST true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_billing_shipping_information.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json {"payment_methods": Assertion.response_data false 2 true false {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information POST true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_payment_info_place_order.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json "[0-9]+" Assertion.response_data false 2 order_id $ BODY ^\d+$ Assertion.response_data false 1 variable order_id 60000 200000 ${request_protocol} ${base_path}checkout/onepage/success/ GET true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_success.jmx Thank you for your purchase! Your order # is Assertion.response_data false 2 1 false 1 ${checkoutByCustomerPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Checkout By Customer"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true mpaf/tool/fragments/ce/common/init_total_products_in_cart_setup.jmx vars.put("totalProductsAdded", "0"); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("category_url_keys_list").size()); vars.put("category_url_key", props.get("category_url_keys_list").get(number)); vars.put("category_name", props.get("category_names_list").get(number)); false mpaf/tool/fragments/ce/common/extract_category_setup.jmx get-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_customer_email.jmx customerUserList = props.get("customer_emails_list"); customerUser = customerUserList.poll(); if (customerUser == null) { SampleResult.setResponseMessage("customernUser list is empty"); SampleResult.setResponseData("customerUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("customer_email", customerUser); true 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}customer/account/login/ GET true false true false false mpaf/tool/fragments/ce/common/open_login_page.jmx <title>Customer Login</title> Assertion.response_data false 2 true ${form_key} = true form_key true ${customer_email} = true login[username] true ${customer_password} = true login[password] true = true send 60000 200000 ${request_protocol} ${base_path}customer/account/loginPost/ POST true false true false false mpaf/tool/fragments/ce/common/login.jmx <title>My Account</title> Assertion.response_data false 2 false addressId customer/address/edit/id/([^'"]+)/ $1$ 1 ^.+$ Assertion.response_data false 1 variable addressId true = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false 60000 200000 ${request_protocol} ${base_path}${category_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/common/open_category.jmx <span class="base" data-ui-id="page-title">${category_name}</span> Assertion.response_data false 6 false category_id <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> $1$ 1 simple_product_1_url_key ^[0-9]+$ Assertion.response_data false 1 variable category_id true 2 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("configurable_products_list").size()); product = props.get("configurable_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true 1 mpaf/tool/fragments/ce/common/get_configurable_product_options.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} 60000 200000 ${request_protocol} ${base_path}rest/V1/configurable-products/${product_sku}/options/all GET true false true false false attribute_ids $.[*].attribute_id NO_VALUE BODY option_values $.[*].values[0].value_index NO_VALUE BODY true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx false try { attribute_ids = vars.get("attribute_ids"); option_values = vars.get("option_values"); attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); option_values = option_values.replace("[","").replace("]","").replace("\"", ""); attribute_ids_array = attribute_ids.split(","); option_values_array = option_values.split(","); args = ctx.getCurrentSampler().getArguments(); it = args.iterator(); while (it.hasNext()) { argument = it.next(); if (argument.getStringValue().contains("${")) { args.removeArgument(argument.getName()); } } for (int i = 0; i < attribute_ids_array.length; i++) { ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); } } catch (Exception e) { log.error("eror…", e); } mpaf/tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx mpaf/tool/fragments/ce/simple_controller.jmx javascript vars.put("alabama_region_id", props.get("alabama_region_id")); vars.put("california_region_id", props.get("california_region_id")); mpaf/tool/fragments/ce/common/get_region_data.jmx 60000 200000 ${request_protocol} ${base_path}checkout/ GET true false true false false mpaf/tool/fragments/ce/customer_checkout/checkout_start.jmx <title>Checkout</title> Assertion.response_data false 2 <title>Shopping Cart</title> Assertion.response_data false 6 false cart_id "quoteData":{"entity_id":"([^'"]+)", $1$ 1 false address_id "default_billing":"([^'"]+)", $1$ 1 false customer_id "customer_id":([^'",]+), $1$ 1 ^.+$ Assertion.response_data false 1 variable cart_id [0-9]+$ Assertion.response_data false 1 variable address_id [0-9]+$ Assertion.response_data false 1 variable customer_id true false {"addressId":"${addressId}"} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/carts/mine/estimate-shipping-methods-by-address-id POST true false true false false mpaf/tool/fragments/ce/customer_checkout/checkout_estimate_shipping_methods.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json "available":true Assertion.response_data false 2 true false {"addressInformation":{"shipping_address":{"customerAddressId":"${address_id}","countryId":"US","regionId":"${alabama_region_id}","regionCode":"AL","region":"Alabama","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/carts/mine/shipping-information POST true false true false false mpaf/tool/fragments/ce/customer_checkout/checkout_billing_shipping_information.jmx Referer ${host}${base_path}checkout/onepage Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json {"payment_methods" Assertion.response_data false 2 true false {"cartId":"${cart_id}","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"customerAddressId":"${address_id}","countryId":"US","regionId":"${alabama_region_id}","regionCode":"AL","region":"Alabama","customerId":"${customer_id}","street":["123 Freedom Blvd. #123"],"telephone":"022-333-4455","postcode":"123123","city":"Fayetteville","firstname":"Anthony","lastname":"Nealy"}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/carts/mine/payment-information POST true false true false false mpaf/tool/fragments/ce/customer_checkout/checkout_payment_info_place_order.jmx Referer ${host}${base_path}checkout/onepage Content-Type application/json; charset=UTF-8 Accept application/json X-Requested-With XMLHttpRequest "[0-9]+" Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}checkout/onepage/success/ GET true false true false false mpaf/tool/fragments/ce/customer_checkout/checkout_success.jmx Thank you for your purchase! Your order number is Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}customer/account/logout/ GET true false true false false mpaf/tool/fragments/ce/common/logout.jmx You are signed out. Assertion.response_data false 2 false curSampler = ctx.getCurrentSampler(); if(curSampler.getName().contains("Checkout success")) { manager = curSampler.getCookieManager(); manager.clear(); } mpaf/tool/fragments/ce/customer_checkout/checkout_clear_cookie.jmx false customerUserList = props.get("customer_emails_list"); customerUserList.add(vars.get("customer_email")); mpaf/tool/fragments/ce/common/return_email_to_pool.jmx 1 false 1 ${reviewByCustomerPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Product Review By Customer"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true get-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_customer_email.jmx customerUserList = props.get("customer_emails_list"); customerUser = customerUserList.poll(); if (customerUser == null) { SampleResult.setResponseMessage("customernUser list is empty"); SampleResult.setResponseData("customerUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("customer_email", customerUser); true 60000 200000 ${request_protocol} ${base_path}customer/account/login/ GET true false true false false mpaf/tool/fragments/ce/common/open_login_page.jmx <title>Customer Login</title> Assertion.response_data false 2 true ${form_key} = true form_key true ${customer_email} = true login[username] true ${customer_password} = true login[password] true = true send 60000 200000 ${request_protocol} ${base_path}customer/account/loginPost/ POST true false true false false mpaf/tool/fragments/ce/common/login.jmx <title>My Account</title> Assertion.response_data false 2 false addressId customer/address/edit/id/([^'"]+)/ $1$ 1 ^.+$ Assertion.response_data false 1 variable addressId true = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${form_key} = true form_key true 3 = true ratings[1] true = true validate_rating true FirstName = true nickname true Some Review Title = true title true Some Review Text = true detail 60000 200000 ${request_protocol} ${base_path}review/product/post/id/${product_id} POST true false true false false mpaf/tool/fragments/ce/product_review/product_review.jmx HTTP/1.1 200 OK Assertion.response_headers false 16 true review,messages = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/product_review/load_review.jmx 1 0 ${__javaScript(Math.round(${reviewDelay}*1000))} mpaf/tool/fragments/ce/product_review/product_review_pause.jmx 60000 200000 ${request_protocol} ${base_path}customer/account/logout/ GET true false true false false mpaf/tool/fragments/ce/common/logout.jmx You are signed out. Assertion.response_data false 2 false customerUserList = props.get("customer_emails_list"); customerUserList.add(vars.get("customer_email")); mpaf/tool/fragments/ce/common/return_email_to_pool.jmx 1 false 1 ${addToCartByCustomerPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Add To Cart By Customer"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true mpaf/tool/fragments/ce/common/init_total_products_in_cart_setup.jmx vars.put("totalProductsAdded", "0"); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("category_url_keys_list").size()); vars.put("category_url_key", props.get("category_url_keys_list").get(number)); vars.put("category_name", props.get("category_names_list").get(number)); false mpaf/tool/fragments/ce/common/extract_category_setup.jmx get-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_customer_email.jmx customerUserList = props.get("customer_emails_list"); customerUser = customerUserList.poll(); if (customerUser == null) { SampleResult.setResponseMessage("customernUser list is empty"); SampleResult.setResponseData("customerUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("customer_email", customerUser); true 60000 200000 ${request_protocol} ${base_path}customer/account/login/ GET true false true false false mpaf/tool/fragments/ce/common/open_login_page.jmx <title>Customer Login</title> Assertion.response_data false 2 true ${form_key} = true form_key true ${customer_email} = true login[username] true ${customer_password} = true login[password] true = true send 60000 200000 ${request_protocol} ${base_path}customer/account/loginPost/ POST true false true false false mpaf/tool/fragments/ce/common/login.jmx <title>My Account</title> Assertion.response_data false 2 false addressId customer/address/edit/id/([^'"]+)/ $1$ 1 ^.+$ Assertion.response_data false 1 variable addressId true = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${category_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/common/open_category.jmx <span class="base" data-ui-id="page-title">${category_name}</span> Assertion.response_data false 6 false category_id <li class="item category([^'"]+)">\s*<strong>${category_name}</strong>\s*</li> $1$ 1 simple_product_1_url_key ^[0-9]+$ Assertion.response_data false 1 variable category_id true 2 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_product_add_to_cart.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true 1 mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("configurable_products_list").size()); product = props.get("configurable_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_products_setup.jmx mpaf/tool/fragments/ce/loops/update_products_added_counter.jmx productsAdded = Integer.parseInt(vars.get("totalProductsAdded")); productsAdded = productsAdded + 1; vars.put("totalProductsAdded", String.valueOf(productsAdded)); true 60000 200000 ${request_protocol} ${base_path}${product_url_key}${url_suffix} GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/product_view.jmx <span>In stock</span> Assertion.response_data false 2 true 1 mpaf/tool/fragments/ce/common/get_configurable_product_options.jmx Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} 60000 200000 ${request_protocol} ${base_path}rest/V1/configurable-products/${product_sku}/options/all GET true false true false false attribute_ids $.[*].attribute_id NO_VALUE BODY option_values $.[*].values[0].value_index NO_VALUE BODY true ${product_id} = true product true = true related_product true 1 = true qty true ${form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}checkout/cart/add/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/configurable_product_add_to_cart.jmx false try { attribute_ids = vars.get("attribute_ids"); option_values = vars.get("option_values"); attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); option_values = option_values.replace("[","").replace("]","").replace("\"", ""); attribute_ids_array = attribute_ids.split(","); option_values_array = option_values.split(","); args = ctx.getCurrentSampler().getArguments(); it = args.iterator(); while (it.hasNext()) { argument = it.next(); if (argument.getStringValue().contains("${")) { args.removeArgument(argument.getName()); } } for (int i = 0; i < attribute_ids_array.length; i++) { ctx.getCurrentSampler().addArgument("super_attribute[" + attribute_ids_array[i] + "]", option_values_array[i]); } } catch (Exception e) { log.error("eror…", e); } mpaf/tool/fragments/ce/common/configurable_product_add_to_cart_preprocessor.jmx X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx true cart,messages = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/load_cart_section.jmx You added ${product_name} to your shopping cart. Assertion.response_data false 2 This product is out of stock. Assertion.response_data false 6 \"summary_count\":${totalProductsAdded} Assertion.response_data false 2 X-Requested-With XMLHttpRequest mpaf/tool/fragments/ce/common/http_header_manager_ajax.jmx mpaf/tool/fragments/ce/simple_controller.jmx 60000 200000 ${base_path}checkout/cart/ GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/open_cart.jmx <title>Shopping Cart</title> Assertion.response_data false 2 false cart_items_qty_inputs name="cart\[([^\[\]]+)\]\[qty\]" $1$ -1 true ${cart_items_qty_inputs_matchNr} mpaf/tool/fragments/ce/loop_controller.jmx 1 1 _counter true true id = vars.get("_counter"); vars.put("uenc", vars.get("cart_items_uencs_" + id)); vars.put("item_id", vars.get("cart_items_qty_inputs_" + id)); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/remove_item_from_cart_setup.jmx true ${form_key} = true form_key true ${uenc} = true uenc false ${item_id} = true id 60000 200000 ${base_path}checkout/cart/delete/ POST true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/remove_item_from_cart.jmx true cart = true sections true true = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/check_cart_is_empty.jmx \"summary_count\":0 Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}customer/account/logout/ GET true false true false false mpaf/tool/fragments/ce/common/logout.jmx You are signed out. Assertion.response_data false 2 false customerUserList = props.get("customer_emails_list"); customerUserList.add(vars.get("customer_email")); mpaf/tool/fragments/ce/common/return_email_to_pool.jmx 1 false 1 ${accountManagementPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Account management"); true 30 ${host} / false 0 true true ${form_key} ${host} ${base_path} false 0 true true true mpaf/tool/fragments/ce/http_cookie_manager.jmx get-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_customer_email.jmx customerUserList = props.get("customer_emails_list"); customerUser = customerUserList.poll(); if (customerUser == null) { SampleResult.setResponseMessage("customernUser list is empty"); SampleResult.setResponseData("customerUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("customer_email", customerUser); true 60000 200000 ${request_protocol} ${base_path} GET true false true false false mpaf/tool/fragments/ce/common/open_home_page.jmx <title>Home page</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}customer/account/login/ GET true false true false false mpaf/tool/fragments/ce/common/open_login_page.jmx <title>Customer Login</title> Assertion.response_data false 2 true ${form_key} = true form_key true ${customer_email} = true login[username] true ${customer_password} = true login[password] true = true send 60000 200000 ${request_protocol} ${base_path}customer/account/loginPost/ POST true false true false false mpaf/tool/fragments/ce/common/login.jmx <title>My Account</title> Assertion.response_data false 2 false addressId customer/address/edit/id/([^'"]+)/ $1$ 1 ^.+$ Assertion.response_data false 1 variable addressId true = true sections true false = true force_new_section_timestamp true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}customer/section/load/ GET true false true false false 60000 200000 ${request_protocol} ${base_path}sales/order/history/ GET true false true false false mpaf/tool/fragments/ce/account_management/my_orders.jmx <title>My Orders</title> Assertion.response_data false 2 false orderId sales/order/view/order_id/(\d+)/ $1$ NOT_FOUND 1 mpaf/tool/fragments/ce/account_management/if_orders.jmx "${orderId}" != "NOT_FOUND" false 60000 200000 ${request_protocol} ${base_path}sales/order/view/order_id/${orderId} GET true false true false false <title>Order # Assertion.response_data false 2 false shipment_tab sales/order/shipment/order_id/(\d+)..Order Shipments $1$ NOT_FOUND 1 May not have shipped "${shipment_tab}" != "NOT_FOUND" false 60000 200000 ${request_protocol} ${base_path}sales/order/shipment/order_id/${orderId} GET true false true false false Track this shipment Assertion.response_data false 2 false popupLink popupWindow": {"windowURL":"([^'"]+)", $1$ 1 60000 200000 ${request_protocol} ${popupLink} GET true false true false false <title>Tracking Information</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}downloadable/customer/products GET true false true false false mpaf/tool/fragments/ce/account_management/my_downloadable_products.jmx <title>My Downloadable Products</title> Assertion.response_data false 2 false orderId sales/order/view/order_id/(\d+)/ $1$ NOT_FOUND 1 false linkId downloadable/download/link/id/(\d+)/ $1$ 1 mpaf/tool/fragments/ce/account_management/if_downloadables.jmx "${orderId}" != "NOT_FOUND" false 60000 200000 ${request_protocol} ${base_path}sales/order/view/order_id/${orderId} GET true false true false false mpaf/tool/fragments/ce/account_management/view_downloadable_products.jmx <title>Order # Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}downloadable/download/link/id/${linkId} GET true false true false false mpaf/tool/fragments/ce/account_management/download_product.jmx 60000 200000 ${request_protocol} ${base_path}wishlist GET true false true false false <title>My Wish List</title> Assertion.response_data false 2 false wishlistId wishlist/index/update/wishlist_id/([^'"]+)/ $1$ 1 mpaf/tool/fragments/ce/account_management/my_wish_list.jmx false buttonTitle Update Wish List FOUND NOT_FOUND 1 mpaf/tool/fragments/ce/account_management/if_wishlist.jmx "${buttonTitle}" === "FOUND" false 60000 200000 ${request_protocol} ${base_path}wishlist/index/share/wishlist_id/${wishlistId}/ GET true false true false false mpaf/tool/fragments/ce/account_management/share_wish_list.jmx <title>Wish List Sharing</title> Assertion.response_data false 2 true ${form_key} = true form_key true true ${customer_email} = true emails true [TEST] See my wishlist!!! = true message 60000 200000 ${request_protocol} ${base_path}wishlist/index/send/wishlist_id/${wishlistId}/ POST true false true false false mpaf/tool/fragments/ce/account_management/send_wish_list.jmx <title>My Wish List</title> Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}customer/account/logout/ GET true false true false false mpaf/tool/fragments/ce/common/logout.jmx You are signed out. Assertion.response_data false 2 false customerUserList = props.get("customer_emails_list"); customerUserList.add(vars.get("customer_email")); mpaf/tool/fragments/ce/common/return_email_to_pool.jmx continue false ${loops} ${adminPoolUsers} ${ramp_period} 1505803944000 1505803944000 false mpaf/tool/fragments/_system/thread_group.jmx 1 false 1 ${adminCMSManagementPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin CMS Management"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx mpaf/tool/fragments/ce/admin_cms_management/admin_cms_management.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/cms/page/ GET true false true false false 60000 200000 ${request_protocol} ${base_path}${admin_path}/cms/page/new GET true false true false false true <p>CMS Content ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true content true = true content_heading true ${admin_form_key} = true form_key true = true identifier true 1 = true is_active true = true layout_update_xml true = true meta_description true = true meta_keywords true = true meta_title false {} = true nodes_data true = true node_ids true = true page_id true 1column = true page_layout true 0 = true store_id[0] true CMS Title ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true title true 0 = true website_root 60000 200000 ${request_protocol} ${base_path}${admin_path}/cms/page/save/ POST true false true false false You saved the page. Assertion.response_data false 16 1 0 ${__javaScript(Math.round(${adminCMSManagementDelay}*1000))} 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${browseProductGridPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Browse Product Grid"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx vars.put("gridEntityType" , "Product"); pagesCount = parseInt(vars.get("products_page_size")) || 20; vars.put("grid_entity_page_size" , pagesCount); vars.put("grid_namespace" , "product_listing"); vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_product_filter_text")); vars.put("grid_filter_field", "name"); // set sort fields and sort directions vars.put("grid_sort_field_1", "name"); vars.put("grid_sort_field_2", "price"); vars.put("grid_sort_field_3", "attribute_set_id"); vars.put("grid_sort_order_1", "asc"); vars.put("grid_sort_order_2", "desc"); javascript mpaf/tool/fragments/ce/admin_browse_products_grid/setup.jmx mpaf/tool/fragments/ce/simple_controller.jmx true ${grid_namespace} = true namespace true true = true search true true true = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true 1 = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx $.totalRecords 0 true false true entity_total_records $.totalRecords BODY var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; var totalsRecord = parseInt(vars.get("entity_total_records")); var pageCount = Math.round(totalsRecord/pageSize); vars.put("grid_pages_count", pageCount); javascript true ${grid_namespace} = true namespace true true = true search true true ${grid_admin_browse_filter_text} = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true 1 = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx $.totalRecords 0 true false true true entity_total_records $.totalRecords BODY var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; var totalsRecord = parseInt(vars.get("entity_total_records")); var pageCount = Math.round(totalsRecord/pageSize); vars.put("grid_pages_count_filtered", pageCount); javascript 1 ${grid_pages_count} 1 page_number true false mpaf/tool/fragments/ce/admin_grid_browsing/select_page_number.jmx true ${grid_namespace} = true namespace true true = true search true true true = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true ${page_number} = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx \"totalRecords\":[^0]\d* Assertion.response_data false 2 1 ${grid_pages_count_filtered} 1 page_number true false mpaf/tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx mpaf/tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx grid_sort_field grid_sort_field true 0 3 grid_sort_order grid_sort_order true 0 2 true ${grid_namespace} = true namespace false true ${grid_admin_browse_filter_text} = true filters[${grid_filter_field}] false true true = true filters[placeholder] false true ${grid_entity_page_size} = true paging[pageSize] false true ${page_number} = true paging[current] false true ${grid_sort_field} = true sorting[field] false true ${grid_sort_order} = true sorting[direction] false true true = true isAjax false 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false \"totalRecords\":[^0]\d* Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${browseOrderGridPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Browse Order Grid"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx vars.put("gridEntityType" , "Order"); pagesCount = parseInt(vars.get("orders_page_size")) || 20; vars.put("grid_entity_page_size" , pagesCount); vars.put("grid_namespace" , "sales_order_grid"); vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_orders_filter_text")); vars.put("grid_filter_field", "status"); // set sort fields and sort directions vars.put("grid_sort_field_1", "increment_id"); vars.put("grid_sort_field_2", "created_at"); vars.put("grid_sort_field_3", "billing_name"); vars.put("grid_sort_order_1", "asc"); vars.put("grid_sort_order_2", "desc"); javascript mpaf/tool/fragments/ce/admin_browse_orders_grid/setup.jmx mpaf/tool/fragments/ce/simple_controller.jmx true ${grid_namespace} = true namespace true true = true search true true true = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true 1 = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx $.totalRecords 0 true false true entity_total_records $.totalRecords BODY var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; var totalsRecord = parseInt(vars.get("entity_total_records")); var pageCount = Math.round(totalsRecord/pageSize); vars.put("grid_pages_count", pageCount); javascript true ${grid_namespace} = true namespace true true = true search true true ${grid_admin_browse_filter_text} = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true 1 = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx $.totalRecords 0 true false true true entity_total_records $.totalRecords BODY var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; var totalsRecord = parseInt(vars.get("entity_total_records")); var pageCount = Math.round(totalsRecord/pageSize); vars.put("grid_pages_count_filtered", pageCount); javascript 1 ${grid_pages_count} 1 page_number true false mpaf/tool/fragments/ce/admin_grid_browsing/select_page_number.jmx true ${grid_namespace} = true namespace true true = true search true true true = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true ${page_number} = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx \"totalRecords\":[^0]\d* Assertion.response_data false 2 1 ${grid_pages_count_filtered} 1 page_number true false mpaf/tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx mpaf/tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx grid_sort_field grid_sort_field true 0 3 grid_sort_order grid_sort_order true 0 2 true ${grid_namespace} = true namespace false true ${grid_admin_browse_filter_text} = true filters[${grid_filter_field}] false true true = true filters[placeholder] false true ${grid_entity_page_size} = true paging[pageSize] false true ${page_number} = true paging[current] false true ${grid_sort_field} = true sorting[field] false true ${grid_sort_order} = true sorting[direction] false true true = true isAjax false 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false \"totalRecords\":[^0]\d* Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${adminProductCreationPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Create Product"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/once_only_controller.jmx mpaf/tool/fragments/ce/admin_create_product/get_related_product_id.jmx import org.apache.jmeter.samplers.SampleResult; import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom}); } relatedIndex = random.nextInt(props.get("simple_products_list").size()); vars.put("related_product_id", props.get("simple_products_list").get(relatedIndex).get("id")); true mpaf/tool/fragments/ce/simple_controller.jmx Content-Type application/json Accept */* mpaf/tool/fragments/ce/api/header_manager_before_token.jmx true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false mpaf/tool/fragments/ce/api/admin_token_retrieval.jmx admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} mpaf/tool/fragments/ce/api/header_manager.jmx false mycolor = true searchCriteria[filterGroups][0][filters][0][value] false attribute_code = true searchCriteria[filterGroups][0][filters][0][field] false mysize = true searchCriteria[filterGroups][0][filters][1][value] false attribute_code = true searchCriteria[filterGroups][0][filters][1][field] 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/attributes GET true false true false false mpaf/tool/fragments/ce/admin_create_product/get_product_attributes.jmx product_attributes $.items BODY javascript var attributesData = JSON.parse(vars.get("product_attributes")), maxOptions = 2; attributes = []; for (i in attributesData) { if (i >= 2) { break; } var data = attributesData[i], attribute = { "id": data.attribute_id, "code": data.attribute_code, "label": data.default_frontend_label, "options": [] }; var processedOptions = 0; for (optionN in data.options) { var option = data.options[optionN]; if (parseInt(option.value) > 0 && processedOptions < maxOptions) { processedOptions++; attribute.options.push(option); } } attributes.push(attribute); } vars.putObject("product_attributes", attributes); 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product_set/index/filter/${attribute_set_filter} GET true false true false false mpaf/tool/fragments/ce/admin_create_product/configurable_setup_attribute_set.jmx false attribute_set_id catalog\/product_set\/edit\/id\/([\d]+)\/"[\D\d]*Attribute Set 1 $1$ 1 false import org.apache.commons.codec.binary.Base64; byte[] encodedBytes = Base64.encodeBase64("set_name=Attribute Set 1".getBytes()); vars.put("attribute_set_filter", new String(encodedBytes)); mpaf/tool/fragments/ce/simple_controller.jmx import org.apache.jmeter.samplers.SampleResult; import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom}); } number = random.nextInt(props.get("simple_products_list_for_edit").size()); simpleList = props.get("simple_products_list_for_edit").get(number); vars.put("simple_product_1_id", simpleList.get("id")); vars.put("simple_product_1_name", simpleList.get("title")); do { number1 = random.nextInt(props.get("simple_products_list_for_edit").size()); } while(number == number1); simpleList = props.get("simple_products_list_for_edit").get(number1); vars.put("simple_product_2_id", simpleList.get("id")); vars.put("simple_product_2_name", simpleList.get("title")); number2 = random.nextInt(props.get("configurable_products_list").size()); configurableList = props.get("configurable_products_list").get(number2); vars.put("configurable_product_1_id", configurableList.get("id")); vars.put("configurable_product_1_url_key", configurableList.get("url_key")); vars.put("configurable_product_1_name", configurableList.get("title")); //Additional category to be added //int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); //vars.put("category_additional", (categoryId+1).toString()); //New price vars.put("price_new", "9999"); //New special price vars.put("special_price_new", "8888"); //New quantity vars.put("quantity_new", "100600"); vars.put("configurable_sku", "Configurable Product - ${__time(YMD)}-${__threadNum}-${__Random(1,1000000)}"); true mpaf/tool/fragments/ce/admin_create_product/setup.jmx mpaf/tool/fragments/ce/admin_create_product/create_bundle_product.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/ GET true false true false false records found Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/new/set/4/type/bundle/ GET true false true false false New Product Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 42 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 1 = true product[product_has_weight] true true 2 = true product[category_ids][] true <p>Full bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] true 1 = true product[status] true = true product[configurable_variations] true 1 = true affect_configurable_product_attributes true = true product[image] true = true product[small_image] true = true product[thumbnail] true bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true 1 = true product[stock_data][notify_stock_qty] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true = true new-variations-attribute-set-id true 0 = true product[shipment_type] true option title one = true bundle_options[bundle_options][0][title] true = true bundle_options[bundle_options][0][option_id] true = true bundle_options[bundle_options][0][delete] true select = true bundle_options[bundle_options][0][type] true 1 = true bundle_options[bundle_options][0][required] true 0 = true bundle_options[bundle_options][0][position] true = true bundle_options[bundle_options][0][bundle_selections][0][selection_id] true = true bundle_options[bundle_options][0][bundle_selections][0][option_id] true ${simple_product_1_id} = true bundle_options[bundle_options][0][bundle_selections][0][product_id] true = true bundle_options[bundle_options][0][bundle_selections][0][delete] true 25 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_qty] true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] true 0 = true bundle_options[bundle_options][0][bundle_selections][0][position] true = true bundle_options[bundle_options][0][bundle_selections][1][selection_id] true = true bundle_options[bundle_options][0][bundle_selections][1][option_id] true ${simple_product_2_id} = true bundle_options[bundle_options][0][bundle_selections][1][product_id] true = true bundle_options[bundle_options][0][bundle_selections][1][delete] true 10.99 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] true 0 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_qty] true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] true 1 = true bundle_options[bundle_options][0][bundle_selections][1][position] true option title two = true bundle_options[bundle_options][1][title] true = true bundle_options[bundle_options][1][option_id] true = true bundle_options[bundle_options][1][delete] true select = true bundle_options[bundle_options][1][type] true 1 = true bundle_options[bundle_options][1][required] true 1 = true bundle_options[bundle_options][1][position] true = true bundle_options[bundle_options][1][bundle_selections][0][selection_id] true true = true bundle_options[bundle_options][1][bundle_selections][0][option_id] true true ${simple_product_1_id} = true bundle_options[bundle_options][1][bundle_selections][0][product_id] true true = true bundle_options[bundle_options][1][bundle_selections][0][delete] true true 5.00 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] true true 0 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] true true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_qty] true true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] true true 0 = true bundle_options[bundle_options][1][bundle_selections][0][position] true true = true bundle_options[bundle_options][1][bundle_selections][1][selection_id] true true = true bundle_options[bundle_options][1][bundle_selections][1][option_id] true true ${simple_product_2_id} = true bundle_options[bundle_options][1][bundle_selections][1][product_id] true true = true bundle_options[bundle_options][1][bundle_selections][1][delete] true true 7.00 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] true true 0 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] true true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_qty] true true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] true true 1 = true bundle_options[bundle_options][1][bundle_selections][1][position] true true 2 = true affect_bundle_product_selections true true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/validate/set/4/ POST true false true false false {"error":false} Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 42 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 1 = true product[product_has_weight] true true 2 = true product[category_ids][] true <p>Full bundle product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] true 1 = true product[status] true = true product[configurable_variations] true 1 = true affect_configurable_product_attributes true = true product[image] true = true product[small_image] true = true product[thumbnail] true bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][notify_stock_qty] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true = true new-variations-attribute-set-id true 0 = true product[shipment_type] false true option title one = true bundle_options[bundle_options][0][title] false true = true bundle_options[bundle_options][0][option_id] false true = true bundle_options[bundle_options][0][delete] false true select = true bundle_options[bundle_options][0][type] false true 1 = true bundle_options[bundle_options][0][required] false true 0 = true bundle_options[bundle_options][0][position] false true = true bundle_options[bundle_options][0][bundle_selections][0][selection_id] false true = true bundle_options[bundle_options][0][bundle_selections][0][option_id] false true ${simple_product_1_id} = true bundle_options[bundle_options][0][bundle_selections][0][product_id] false true = true bundle_options[bundle_options][0][bundle_selections][0][delete] false true 25 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] false true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] false true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_qty] false true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] false true 0 = true bundle_options[bundle_options][0][bundle_selections][0][position] false true = true bundle_options[bundle_options][0][bundle_selections][1][selection_id] false true = true bundle_options[bundle_options][0][bundle_selections][1][option_id] false true ${simple_product_2_id} = true bundle_options[bundle_options][0][bundle_selections][1][product_id] false true = true bundle_options[bundle_options][0][bundle_selections][1][delete] false true 10.99 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] false true 0 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] false true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_qty] false true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] false true 1 = true bundle_options[bundle_options][0][bundle_selections][1][position] false true option title two = true bundle_options[bundle_options][1][title] false true = true bundle_options[bundle_options][1][option_id] false true = true bundle_options[bundle_options][1][delete] false true select = true bundle_options[bundle_options][1][type] false true 1 = true bundle_options[bundle_options][1][required] false true 1 = true bundle_options[bundle_options][1][position] false true = true bundle_options[bundle_options][1][bundle_selections][0][selection_id] false true = true bundle_options[bundle_options][1][bundle_selections][0][option_id] false true ${simple_product_1_id} = true bundle_options[bundle_options][1][bundle_selections][0][product_id] false true = true bundle_options[bundle_options][1][bundle_selections][0][delete] false true 5.00 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] false true 0 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] false true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_qty] false true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] false true 0 = true bundle_options[bundle_options][1][bundle_selections][0][position] false true = true bundle_options[bundle_options][1][bundle_selections][1][selection_id] false true = true bundle_options[bundle_options][1][bundle_selections][1][option_id] false true ${simple_product_2_id} = true bundle_options[bundle_options][1][bundle_selections][1][product_id] false true = true bundle_options[bundle_options][1][bundle_selections][1][delete] false true 7.00 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] false true 0 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] false true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_qty] false true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] false true 1 = true bundle_options[bundle_options][1][bundle_selections][1][position] false true 2 = true affect_bundle_product_selections false true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/save/set/4/type/bundle/back/edit/active_tab/product-details/ POST true false true false false You saved the product option title one option title two ${simple_product_2_name} ${simple_product_1_name} Assertion.response_data false 2 mpaf/tool/fragments/ce/simple_controller.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/ GET true false true false false mpaf/tool/fragments/ce/admin_create_product/open_catalog_grid.jmx records found Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/new/set/${attribute_set_id}/type/configurable/ GET true false true false false mpaf/tool/fragments/ce/admin_create_product/new_configurable.jmx New Product Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true 1 = true affect_configurable_product_attributes true true ${admin_form_key} = true form_key true true ${attribute_set_id} = true new-variations-attribute-set-id true true 1 = true product[affect_product_custom_options] true true ${attribute_set_id} = true product[attribute_set_id] true true 4 = true product[category_ids][0] true true = true product[custom_layout_update] true true = true product[description] true true 0 = true product[gift_message_available] true true 1 = true product[gift_wrapping_available] true true = true product[gift_wrapping_price] true true = true product[image] true true 2 = true product[is_returnable] true true ${configurable_sku} - Meta Description = true product[meta_description] true true ${configurable_sku} - Meta Keyword = true product[meta_keyword] true true ${configurable_sku} - Meta Title = true product[meta_title] true true ${configurable_sku} = true product[name] true true container2 = true product[options_container] true true ${price_new} = true product[price] true true 1 = true product[product_has_weight] true true 1 = true product[quantity_and_stock_status][is_in_stock] true true 1000 = true product[quantity_and_stock_status][qty] true true = true product[short_description] true true ${configurable_sku} = true product[sku] true true = true product[small_image] true true ${special_price_new} = true product[special_price] true true 1 = true product[status] true true 0 = true product[stock_data][backorders] true true 1 = true product[stock_data][deferred_stock_update] true true 0 = true product[stock_data][enable_qty_increments] true true 0 = true product[stock_data][is_decimal_divided] true true 0 = true product[stock_data][is_qty_decimal] true true 1 = true product[stock_data][manage_stock] true true 10000 = true product[stock_data][max_sale_qty] true true 0 = true product[stock_data][min_qty] true true 1 = true product[stock_data][min_sale_qty] true true 1 = true product[stock_data][notify_stock_qty] true true 1 = true product[stock_data][qty_increments] true true 1 = true product[stock_data][use_config_backorders] true true 1 = true product[stock_data][use_config_deferred_stock_update] true true 1 = true product[stock_data][use_config_enable_qty_increments] true true 1 = true product[stock_data][use_config_manage_stock] true true 1 = true product[stock_data][use_config_max_sale_qty] true true 1 = true product[stock_data][use_config_min_qty] true true 1 = true product[stock_data][use_config_min_sale_qty] true true 1 = true product[stock_data][use_config_notify_stock_qty] true true 1 = true product[stock_data][use_config_qty_increments] true true 2 = true product[tax_class_id] true true = true product[thumbnail] true true = true product[url_key] true true 1 = true product[use_config_gift_message_available] true true 1 = true product[use_config_gift_wrapping_available] true true 1 = true product[use_config_is_returnable] true true 4 = true product[visibility] true true 1 = true product[website_ids][1] true true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/validate/set/${attribute_set_id}/ POST true false true false false mpaf/tool/fragments/ce/admin_create_product/configurable_validate.jmx {"error":false} Assertion.response_data false 2 javascript attributes = vars.getObject("product_attributes"); for (i in attributes) { var attribute = attributes[i]; sampler.addArgument("attribute_codes[" + i + "]", attribute.code); sampler.addArgument("attributes[" + i + "]", attribute.id); sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); addConfigurableAttributeData(attribute); } addConfigurableMatrix(attributes); function addConfigurableAttributeData(attribute) { var attributeId = attribute.id; sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); attribute.options.forEach(function (option, index) { sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); }); } /** * Build 4 simple products for Configurable */ function addConfigurableMatrix(attributes) { var attribute1 = attributes[0], attribute2 = attributes[1], productIndex = 1, products = []; var variationNames = []; attribute1.options.forEach(function (option1) { attribute2.options.forEach(function (option2) { var productAttributes = {}, namePart = option1.label + "+" + option2.label, variationKey = option1.value + "-" + option2.value; productAttributes[attribute1.code] = option1.value; productAttributes[attribute2.code] = option2.value; variationNames.push(namePart + " - " + vars.get("configurable_sku")); var product = { "id": null, "name": namePart + " - " + vars.get("configurable_sku"), "sku": namePart + " - " + vars.get("configurable_sku"), "status": 1, "price": "100", "price_currency": "$", "price_string": "$100", "weight": "6", "qty": "50", "variationKey": variationKey, "configurable_attribute": JSON.stringify(productAttributes), "thumbnail_image": "", "media_gallery": {"images": {}}, "image": [], "was_changed": true, "canEdit": 1, "newProduct": 1, "record_id": productIndex }; productIndex++; products.push(product); }); }); sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); vars.putObject("configurable_variations_assertion", variationNames); } mpaf/tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx true true = true ajax false true true = true isAjax false true 1 = true affect_configurable_product_attributes true true ${admin_form_key} = true form_key true true ${attribute_set_id} = true new-variations-attribute-set-id true true 1 = true product[affect_product_custom_options] true true ${attribute_set_id} = true product[attribute_set_id] true true 2 = true product[category_ids][0] true true = true product[custom_layout_update] true true = true product[description] true true 0 = true product[gift_message_available] true true 1 = true product[gift_wrapping_available] true true = true product[gift_wrapping_price] true true = true product[image] true true 2 = true product[is_returnable] true true ${configurable_sku} - Meta Description = true product[meta_description] true true ${configurable_sku} - Meta Keyword = true product[meta_keyword] true true ${configurable_sku} - Meta Title = true product[meta_title] true true ${configurable_sku} = true product[name] true true container2 = true product[options_container] true true ${price_new} = true product[price] true true 1 = true product[product_has_weight] true true 1 = true product[quantity_and_stock_status][is_in_stock] true true 1000 = true product[quantity_and_stock_status][qty] true true = true product[short_description] true true ${configurable_sku} = true product[sku] true true = true product[small_image] true true ${special_price_new} = true product[special_price] true true 1 = true product[status] true true 0 = true product[stock_data][backorders] true true 1 = true product[stock_data][deferred_stock_update] true true 0 = true product[stock_data][enable_qty_increments] true true 0 = true product[stock_data][is_decimal_divided] true true 0 = true product[stock_data][is_qty_decimal] true true 1 = true product[stock_data][manage_stock] true true 10000 = true product[stock_data][max_sale_qty] true true 0 = true product[stock_data][min_qty] true true 1 = true product[stock_data][min_sale_qty] true true 1 = true product[stock_data][notify_stock_qty] true true 1 = true product[stock_data][qty_increments] true true 1 = true product[stock_data][use_config_backorders] true true 1 = true product[stock_data][use_config_deferred_stock_update] true true 1 = true product[stock_data][use_config_enable_qty_increments] true true 1 = true product[stock_data][use_config_manage_stock] true true 1 = true product[stock_data][use_config_max_sale_qty] true true 1 = true product[stock_data][use_config_min_qty] true true 1 = true product[stock_data][use_config_min_sale_qty] true true 1 = true product[stock_data][use_config_notify_stock_qty] true true 1 = true product[stock_data][use_config_qty_increments] true true 2 = true product[tax_class_id] true true = true product[thumbnail] true true = true product[url_key] true true 1 = true product[use_config_gift_message_available] true true 1 = true product[use_config_gift_wrapping_available] true true 1 = true product[use_config_is_returnable] true true 4 = true product[visibility] true true 1 = true product[website_ids][1] true true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/save/set/${attribute_set_id}/type/configurable/back/edit/active_tab/product-details/ POST true false true false false mpaf/tool/fragments/ce/admin_create_product/configurable_save.jmx You saved the product Assertion.response_data false 2 javascript var configurableVariations = vars.getObject("configurable_variations_assertion"), response = SampleResult.getResponseDataAsString(); configurableVariations.forEach(function (variation) { if (response.indexOf(variation) == -1) { AssertionResult.setFailureMessage("Cannot find variation \"" + variation + "\""); AssertionResult.setFailure(true); } }); javascript attributes = vars.getObject("product_attributes"); for (i in attributes) { var attribute = attributes[i]; sampler.addArgument("attribute_codes[" + i + "]", attribute.code); sampler.addArgument("attributes[" + i + "]", attribute.id); sampler.addArgument("product[" + attribute.code + "]", attribute.options[0].value); addConfigurableAttributeData(attribute); } addConfigurableMatrix(attributes); function addConfigurableAttributeData(attribute) { var attributeId = attribute.id; sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attribute.code); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attribute.label); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][position]", 0); attribute.options.forEach(function (option, index) { sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][include]", index); sampler.addArgument("product[configurable_attributes_data][" + attributeId + "][values][" + option.value + "][value_index]", option.value); }); } /** * Build 4 simple products for Configurable */ function addConfigurableMatrix(attributes) { var attribute1 = attributes[0], attribute2 = attributes[1], productIndex = 1, products = []; var variationNames = []; attribute1.options.forEach(function (option1) { attribute2.options.forEach(function (option2) { var productAttributes = {}, namePart = option1.label + "+" + option2.label, variationKey = option1.value + "-" + option2.value; productAttributes[attribute1.code] = option1.value; productAttributes[attribute2.code] = option2.value; variationNames.push(namePart + " - " + vars.get("configurable_sku")); var product = { "id": null, "name": namePart + " - " + vars.get("configurable_sku"), "sku": namePart + " - " + vars.get("configurable_sku"), "status": 1, "price": "100", "price_currency": "$", "price_string": "$100", "weight": "6", "qty": "50", "variationKey": variationKey, "configurable_attribute": JSON.stringify(productAttributes), "thumbnail_image": "", "media_gallery": {"images": {}}, "image": [], "was_changed": true, "canEdit": 1, "newProduct": 1, "record_id": productIndex }; productIndex++; products.push(product); }); }); sampler.addArgument("configurable-matrix-serialized", JSON.stringify(products)); vars.putObject("configurable_variations_assertion", variationNames); } mpaf/tool/fragments/ce/admin_create_product/configurable_prepare_data.jmx mpaf/tool/fragments/ce/admin_create_product/create_downloadable_product.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/ GET true false true false false records found Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/new/set/4/type/downloadable/ GET true false true false false New Product Assertion.response_data false 2 ${files_folder}downloadable_original.txt links text/plain true ${admin_form_key} = true form_key false 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/downloadable_file/upload/type/links/?isAjax=true POST false false true true false original_file $.file BODY ${files_folder}downloadable_sample.txt samples text/plain true ${admin_form_key} = true form_key false 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/downloadable_file/upload/type/samples/?isAjax=true POST false false true true false sample_file $.file BODY true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 123 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 2 = true product[category_ids][] true <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] true 1 = true product[status] true = true product[image] true = true product[small_image] true = true product[thumbnail] true downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true 1 = true product[stock_data][notify_stock_qty] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true on = true is_downloadable true Links = true product[links_title] true 0 = true product[links_purchased_separately] true ${original_file} = true downloadable[link][0][file][0][file] false true downloadable_original.txt = true downloadable[link][0][file][0][name] false true 13 = true downloadable[link][0][file][0][size] false true new = true downloadable[link][0][file][0][status] false true 1 = true downloadable[link][0][is_shareable] true 0 = true downloadable[link][0][is_unlimited] true = true downloadable[link][0][link_url] true 0 = true downloadable[link][0][number_of_downloads] true true 120 = true downloadable[link][0][price] true true 0 = true downloadable[link][0][record_id] true true file = true downloadable[link][0][sample][type] true = true downloadable[link][0][sample][url] true 1 = true downloadable[link][0][sort_order] true Original Link = true downloadable[link][0][title] true file = true downloadable[link][0][type] true ${sample_file} = true downloadable[sample][0][file][0][file] true true downloadable_sample.txt = true downloadable[sample][0][file][0][name] true true 14 = true downloadable[sample][0][file][0][size] true true new = true downloadable[sample][0][file][0][status] true true 0 = true downloadable[sample][0][record_id] true true = true downloadable[sample][0][sample_url] true true 1 = true downloadable[sample][0][sort_order] true true Sample Link = true downloadable[sample][0][title] true true file = true downloadable[sample][0][type] true true 1 = true affect_configurable_product_attributes false true 4 = true new-variations-attribute-set-id false true = true product[configurable_variation] false true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/validate/set/4/type/downloadable/ POST true false true false false {"error":false} Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 123 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 2 = true product[category_ids][] true <p>Full downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short downloadable product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] false true 1 = true product[status] true = true product[image] true = true product[small_image] true = true product[thumbnail] true downloadable-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Downloadable Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][notify_stock_qty] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true ${original_file} = true downloadable[link][0][file][0][file] false true downloadable_original.txt = true downloadable[link][0][file][0][name] false true 13 = true downloadable[link][0][file][0][size] false true new = true downloadable[link][0][file][0][status] false true 1 = true downloadable[link][0][is_shareable] true true 0 = true downloadable[link][0][is_unlimited] true true = true downloadable[link][0][link_url] true true 0 = true downloadable[link][0][number_of_downloads] false true 120 = true downloadable[link][0][price] false true 0 = true downloadable[link][0][record_id] false true file = true downloadable[link][0][sample][type] true true = true downloadable[link][0][sample][url] true true 1 = true downloadable[link][0][sort_order] true true Original Link = true downloadable[link][0][title] true true file = true downloadable[link][0][type] true true ${sample_file} = true downloadable[sample][0][file][0][file] true true downloadable_sample.txt = true downloadable[sample][0][file][0][name] true true 14 = true downloadable[sample][0][file][0][size] true true new = true downloadable[sample][0][file][0][status] true true 0 = true downloadable[sample][0][record_id] true true = true downloadable[sample][0][sample_url] true true 1 = true downloadable[sample][0][sort_order] true true Sample Link = true downloadable[sample][0][title] true true file = true downloadable[sample][0][type] true true 1 = true affect_configurable_product_attributes false true 4 = true new-variations-attribute-set-id false true = true product[configurable_variation] false true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/save/set/4/type/downloadable/back/edit/active_tab/product-details/ POST true false true false false You saved the product Assertion.response_data false 2 violation Assertion.response_data false 6 mpaf/tool/fragments/ce/admin_create_product/create_simple_product.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/ GET true false true false false records found Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/new/set/4/type/simple/ GET true false true false false New Product Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 123 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 1 = true product[product_has_weight] true true 2 = true product[category_ids][] true <p>Full simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] true 1 = true product[status] true = true product[image] true = true product[small_image] true = true product[thumbnail] true simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true 1 = true product[stock_data][notify_stock_qty] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true = true product[options][1][is_delete] false true 1 = true product[options][1][is_require] false true select = true product[options][1][previous_group] false true drop_down = true product[options][1][previous_type] false true 0 = true product[options][1][sort_order] false true Product Option Title One = true product[options][1][title] false true drop_down = true product[options][1][type] false true = true product[options][1][values][1][is_delete] false true 200 = true product[options][1][values][1][price] false true fixed = true product[options][1][values][1][price_type] false true sku-one = true product[options][1][values][1][sku] false true 0 = true product[options][1][values][1][sort_order] false true Row Title = true product[options][1][values][1][title] false true = true product[options][2][is_delete] false true 1 = true product[options][2][is_require] false true 250 = true product[options][2][max_characters] false true text = true product[options][2][previous_group] false true field = true product[options][2][previous_type] false true 500 = true product[options][2][price] false true fixed = true product[options][2][price_type] false true sku-two = true product[options][2][sku] false true 1 = true product[options][2][sort_order] false true Field Title = true product[options][2][title] false true field = true product[options][2][type] false true 1 = true affect_configurable_product_attributes true true 4 = true new-variations-attribute-set-id true true = true product[configurable_variation] true true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/validate/set/4/ POST true false true false false {"error":false} Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true SKU ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 123 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 1 = true product[product_has_weight] true true 2 = true product[category_ids][] true <p>Full simple product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short simple product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] true 1 = true product[status] true = true product[image] true = true product[small_image] true = true product[thumbnail] true simple-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Simple Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][notify_stock_qty] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true = true product[options][1][is_delete] true true 1 = true product[options][1][is_require] true select = true product[options][1][previous_group] false true drop_down = true product[options][1][previous_type] false true 0 = true product[options][1][sort_order] false true Product Option Title One = true product[options][1][title] true drop_down = true product[options][1][type] true = true product[options][1][values][1][is_delete] false true 200 = true product[options][1][values][1][price] true fixed = true product[options][1][values][1][price_type] true sku-one = true product[options][1][values][1][sku] true 0 = true product[options][1][values][1][sort_order] true Row Title = true product[options][1][values][1][title] true = true product[options][2][is_delete] false true 1 = true product[options][2][is_require] true 250 = true product[options][2][max_characters] true text = true product[options][2][previous_group] true field = true product[options][2][previous_type] true 500 = true product[options][2][price] true fixed = true product[options][2][price_type] true sku-two = true product[options][2][sku] true 1 = true product[options][2][sort_order] true Field Title = true product[options][2][title] true field = true product[options][2][type] true 1 = true affect_configurable_product_attributes true true 4 = true new-variations-attribute-set-id true true = true product[configurable_variation] true true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/save/set/4/type/simple/back/edit/active_tab/product-details/ POST true false true false false You saved the product Assertion.response_data false 2 violation Assertion.response_data false 6 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${adminProductEditingPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Edit Product"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx mpaf/tool/fragments/ce/admin_edit_product/admin_edit_product_updated.jmx import java.util.ArrayList; import java.util.HashMap; import java.util.Random; try { Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } simpleCount = props.get("simple_products_list_for_edit").size(); configCount = props.get("configurable_products_list_for_edit").size(); productCount = 0; if (simpleCount > configCount) { productCount = configCount; } else { productCount = simpleCount; } int threadsNumber = ctx.getThreadGroup().getNumThreads(); if (threadsNumber == 0) { threadsNumber = 1; } //Current thread number starts from 0 currentThreadNum = ctx.getThreadNum(); String siterator = vars.get("threadIterator_" + currentThreadNum.toString()); iterator = 0; if(siterator == null){ vars.put("threadIterator_" + currentThreadNum.toString() , "0"); } else { iterator = Integer.parseInt(siterator); iterator ++; vars.put("threadIterator_" + currentThreadNum.toString() , iterator.toString()); } //Number of products for one thread productClusterLength = productCount / threadsNumber; if (iterator >= productClusterLength) { vars.put("threadIterator_" + currentThreadNum.toString(), "0"); iterator = 0; } //Index of the current product from the cluster i = productClusterLength * currentThreadNum + iterator; //ids of simple and configurable products to edit vars.put("simple_product_id", props.get("simple_products_list_for_edit").get(i).get("id")); vars.put("configurable_product_id", props.get("configurable_products_list_for_edit").get(i).get("id")); //id of related product do { relatedIndex = random.nextInt(props.get("simple_products_list_for_edit").size()); } while(i == relatedIndex); vars.put("related_product_id", props.get("simple_products_list_for_edit").get(relatedIndex).get("id")); } catch (Exception ex) { log.info("Script execution failed", ex); } false 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/edit/id/${simple_product_id}/ GET true false true false false Product Assertion.response_data false 16 false simple_product_name ,"name":"([^'"]+)", $1$ 1 false simple_product_sku ,"sku":"([^'"]+)", $1$ 1 false simple_product_category_id ,"category_ids":."(\d+)". $1$ 1 Passing arguments between threads //Additional category to be added import java.util.Random; Random randomGenerator = new Random(); if (${seedForRandom} > 0) { randomGenerator.setSeed(${seedForRandom} + ${__threadNum}); } int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); categoryList = props.get("admin_category_ids_list"); if (categoryList.size() > 1) { do { int index = randomGenerator.nextInt(categoryList.size()); newCategoryId = categoryList.get(index); } while (categoryId == newCategoryId); vars.put("category_additional", newCategoryId.toString()); } //New price vars.put("price_new", "9999"); //New special price vars.put("special_price_new", "8888"); //New quantity vars.put("quantity_new", "100600"); false true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true ${simple_product_name} = true product[name] false true ${simple_product_sku} = true product[sku] false true ${price_new} = true product[price] false true 2 = true product[tax_class_id] false true ${quantity_new} = true product[quantity_and_stock_status][qty] false true 1 = true product[quantity_and_stock_status][is_in_stock] false true 1.0000 = true product[weight] false true 1 = true product[product_has_weight] false true ${simple_product_category_id} = true product[category_ids][] false true <p>Full simple product Description ${simple_product_id} Edited</p> = true product[description] false true 1 = true product[status] false true = true product[configurable_variations] false true 1 = true affect_configurable_product_attributes false true = true product[image] false true = true product[small_image] false true = true product[thumbnail] false true ${simple_product_name} = true product[url_key] false true ${simple_product_name} Meta Title Edited = true product[meta_title] false true ${simple_product_name} Meta Keyword Edited = true product[meta_keyword] false true ${simple_product_name} Meta Description Edited = true product[meta_description] false true 1 = true product[website_ids][] false true ${special_price_new} = true product[special_price] false true = true product[special_from_date] false true = true product[special_to_date] false true = true product[cost] false true 1 = true product[stock_data][use_config_manage_stock] false true ${quantity_new} = true product[stock_data][original_inventory_qty] false true ${quantity_new} = true product[stock_data][qty] false true 0 = true product[stock_data][min_qty] false true 1 = true product[stock_data][use_config_min_qty] false true 1 = true product[stock_data][min_sale_qty] false true 1 = true product[stock_data][use_config_min_sale_qty] false true 10000 = true product[stock_data][max_sale_qty] false true 1 = true product[stock_data][use_config_max_sale_qty] false true 0 = true product[stock_data][is_qty_decimal] false true 0 = true product[stock_data][is_decimal_divided] false true 0 = true product[stock_data][backorders] false true 1 = true product[stock_data][use_config_backorders] false true 1 = true product[stock_data][notify_stock_qty] false true 1 = true product[stock_data][use_config_notify_stock_qty] false true 0 = true product[stock_data][enable_qty_increments] false true 0 = true product[stock_data][qty_increments] false true 1 = true product[stock_data][use_config_qty_increments] false true 1 = true product[stock_data][is_in_stock] false true = true product[custom_design] false true = true product[custom_design_from] false true = true product[custom_design_to] false true = true product[custom_layout_update] false true = true product[page_layout] false true container2 = true product[options_container] false true = true new-variations-attribute-set-id false 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/validate/id/${simple_product_id}/?isAjax=true POST true false true false false {"error":false} Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true ${simple_product_name} = true product[name] false true ${simple_product_sku} = true product[sku] false true ${price_new} = true product[price] false true 2 = true product[tax_class_id] false true ${quantity_new} = true product[quantity_and_stock_status][qty] false true 1 = true product[quantity_and_stock_status][is_in_stock] false true 1.0000 = true product[weight] false true 1 = true product[product_has_weight] false true ${simple_product_category_id} = true product[category_ids][] false true ${category_additional} = true product[category_ids][] true <p>Full simple product Description ${simple_product_id} Edited</p> = true product[description] false true 1 = true product[status] false true = true product[configurable_variations] false true 1 = true affect_configurable_product_attributes false true = true product[image] false true = true product[small_image] false true = true product[thumbnail] false true ${simple_product_name} = true product[url_key] false true ${simple_product_name} Meta Title Edited = true product[meta_title] false true ${simple_product_name} Meta Keyword Edited = true product[meta_keyword] false true ${simple_product_name} Meta Description Edited = true product[meta_description] false true 1 = true product[website_ids][] false true ${special_price_new} = true product[special_price] false true = true product[special_from_date] false true = true product[special_to_date] false true = true product[cost] false true 1 = true product[stock_data][use_config_manage_stock] false true ${quantity_new} = true product[stock_data][original_inventory_qty] false true ${quantity_new} = true product[stock_data][qty] false true 0 = true product[stock_data][min_qty] false true 1 = true product[stock_data][use_config_min_qty] false true 1 = true product[stock_data][min_sale_qty] false true 1 = true product[stock_data][use_config_min_sale_qty] false true 10000 = true product[stock_data][max_sale_qty] false true 1 = true product[stock_data][use_config_max_sale_qty] false true 0 = true product[stock_data][is_qty_decimal] false true 0 = true product[stock_data][is_decimal_divided] false true 0 = true product[stock_data][backorders] false true 1 = true product[stock_data][use_config_backorders] false true 1 = true product[stock_data][notify_stock_qty] false true 1 = true product[stock_data][use_config_notify_stock_qty] false true 0 = true product[stock_data][enable_qty_increments] false true 0 = true product[stock_data][qty_increments] false true 1 = true product[stock_data][use_config_qty_increments] false true 1 = true product[stock_data][is_in_stock] false true = true product[custom_design] false true = true product[custom_design_from] false true = true product[custom_design_to] false true = true product[custom_layout_update] false true = true product[page_layout] false true container2 = true product[options_container] false true = true new-variations-attribute-set-id false 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/save/id/${simple_product_id}/back/edit/active_tab/product-details/ POST true false true false false You saved the product Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/edit/id/${configurable_product_id}/ GET true false true false false Product Assertion.response_data false 16 false configurable_product_name ,"name":"([^'"]+)", $1$ 1 false configurable_product_sku ,"sku":"([^'"]+)", $1$ 1 false configurable_product_category_id ,"category_ids":."(\d+)" $1$ 1 false configurable_attribute_id ,"configurable_variation":"([^'"]+)", $1$ 1 true false configurable_matrix "configurable-matrix":(\[.*?\]) $1$ 1 true associated_products_ids $.[*].id configurable_matrix VAR false configurable_product_data (\{"product":.*?configurable_attributes_data.*?\})\s*< $1$ 1 configurable_attributes_data $.product.configurable_attributes_data configurable_product_data VAR false configurable_attribute_ids "attribute_id":"(\d+)" $1$ -1 variable configurable_attributes_data false configurable_attribute_codes "code":"(\w+)" $1$ -1 variable configurable_attributes_data false configurable_attribute_labels "label":"(.*?)" $1$ -1 variable configurable_attributes_data false configurable_attribute_values "values":(\{(?:\}|.*?\}\})) $1$ -1 variable configurable_attributes_data configurable_attribute_ids configurable_attribute_id true 1 ${configurable_attribute_ids_matchNr} 1 attribute_counter true true return vars.get("configurable_attribute_values_" + vars.get("attribute_counter")); false false attribute_${configurable_attribute_id}_values "value_index":"(\d+)" $1$ -1 configurable_attribute_values_${attribute_counter} true true = true isAjax false true ${admin_form_key} = true form_key false true ${configurable_product_name} = true product[name] false true ${configurable_product_sku} = true product[sku] false true ${price_new} = true product[price] false true 2 = true product[tax_class_id] false true 1 = true product[quantity_and_stock_status][is_in_stock] false true 3 = true product[weight] false true ${configurable_product_category_id} = true product[category_ids][] false true ${category_additional} = true product[category_ids][] false true <p>Configurable product description ${configurable_product_id} Edited</p> = true product[description] false true 1 = true product[status] false true ${configurable_product_name} Meta Title Edited = true product[meta_title] false true ${configurable_product_name} Meta Keyword Edited = true product[meta_keyword] false true ${configurable_product_name} Meta Description Edited = true product[meta_description] false true 1 = true product[website_ids][] false true ${special_price_new} = true product[special_price] false true = true product[special_from_date] false true = true product[special_to_date] false true = true product[cost] false true 1 = true product[stock_data][use_config_manage_stock] false true 0 = true product[stock_data][min_qty] false true 1 = true product[stock_data][use_config_min_qty] false true 1 = true product[stock_data][min_sale_qty] false true 1 = true product[stock_data][use_config_min_sale_qty] false true 1 = true product[stock_data][use_config_max_sale_qty] false true 0 = true product[stock_data][is_qty_decimal] false true 0 = true product[stock_data][is_decimal_divided] false true 0 = true product[stock_data][backorders] false true 1 = true product[stock_data][use_config_backorders] false true 1 = true product[stock_data][notify_stock_qty] false true 1 = true product[stock_data][use_config_notify_stock_qty] false true 0 = true product[stock_data][enable_qty_increments] false true 0 = true product[stock_data][qty_increments] false true 1 = true product[stock_data][use_config_qty_increments] false true 1 = true product[stock_data][is_in_stock] false true = true product[custom_design] false true = true product[custom_design_from] false true = true product[custom_design_to] false true = true product[custom_layout_update] false true = true product[page_layout] false true container2 = true product[options_container] false true ${configurable_attribute_id} = true product[configurable_variation] false true ${configurable_product_name} = true product[url_key] true 1 = true product[use_config_gift_message_available] true 1 = true product[use_config_gift_wrapping_available] true 4 = true product[visibility] true 1 = true product[product_has_weight] true true 50 = true product[stock_data][qty] false true configurable = true product[stock_data][type_id] false 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/validate/id/${configurable_product_id}/ POST true false true false false false try { int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); for (int i = 1; i <= attributesCount; i++) { attributeId = vars.get("configurable_attribute_ids_" + i.toString()); attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); for (int j = 1; j <= valuesCount; j++) { attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); ctx.getCurrentSampler().addArgument( "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", "1" ); ctx.getCurrentSampler().addArgument( "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", attributeValue ); } } ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); } catch (Exception e) { log.error("error???", e); } {"error":false} Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true ${configurable_product_name} = true product[name] false true ${configurable_product_sku} = true product[sku] false true ${price_new} = true product[price] false true 2 = true product[tax_class_id]admin false true 1 = true product[quantity_and_stock_status][is_in_stock] false true 3 = true product[weight] false true ${configurable_product_category_id} = true product[category_ids][] false true ${category_additional} = true product[category_ids][] false true <p>Configurable product description ${configurable_product_id} Edited</p> = true product[description] false true 1 = true product[status] false true ${configurable_product_name} Meta Title Edited = true product[meta_title] false true ${configurable_product_name} Meta Keyword Edited = true product[meta_keyword] false true ${configurable_product_name} Meta Description Edited = true product[meta_description] false true 1 = true product[website_ids][] false true ${special_price_new} = true product[special_price] false true = true product[special_from_date] false true = true product[special_to_date] false true = true product[cost] false true 1 = true product[stock_data][use_config_manage_stock] false true 0 = true product[stock_data][min_qty] false true 1 = true product[stock_data][use_config_min_qty] false true 1 = true product[stock_data][min_sale_qty] false true 1 = true product[stock_data][use_config_min_sale_qty] false true 1 = true product[stock_data][use_config_max_sale_qty] false true 0 = true product[stock_data][is_qty_decimal] false true 0 = true product[stock_data][is_decimal_divided] false true 0 = true product[stock_data][backorders] false true 1 = true product[stock_data][use_config_backorders] false true 1 = true product[stock_data][notify_stock_qty] false true 1 = true product[stock_data][use_config_notify_stock_qty] false true 0 = true product[stock_data][enable_qty_increments] false true 0 = true product[stock_data][qty_increments] false true 1 = true product[stock_data][use_config_qty_increments] false true 1 = true product[stock_data][is_in_stock] false true = true product[custom_design] false true = true product[custom_design_from] false true = true product[custom_design_to] false true = true product[custom_layout_update] false true = true product[page_layout] false true container2 = true product[options_container] false true ${configurable_attribute_id} = true product[configurable_variation] false true ${configurable_product_name} = true product[url_key] true 1 = true product[use_config_gift_message_available] true 1 = true product[use_config_gift_wrapping_available] true 4 = true product[visibility] true 1 = true product[product_has_weight] true true 50 = true product[stock_data][qty] false true configurable = true product[stock_data][type_id] false 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/save/id/${configurable_product_id}/back/edit/active_tab/product-details/ POST true false true false false false try { int attributesCount = Integer.parseInt(vars.get("configurable_attribute_ids_matchNr")); for (int i = 1; i <= attributesCount; i++) { attributeId = vars.get("configurable_attribute_ids_" + i.toString()); attributeCode = vars.get("configurable_attribute_codes_" + i.toString()); attributeLabel = vars.get("configurable_attribute_labels_" + i.toString()); ctx.getCurrentSampler().addArgument("attributes[" + (i - 1).toString() + "]", attributeId); ctx.getCurrentSampler().addArgument("attribute_codes[" + (i - 1).toString() + "]", attributeCode); ctx.getCurrentSampler().addArgument("product[" + attributeCode + "]", attributeId); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][attribute_id]", attributeId); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][position]", (i - 1).toString()); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][code]", attributeCode); ctx.getCurrentSampler().addArgument("product[configurable_attributes_data][" + attributeId + "][label]", attributeLabel); int valuesCount = Integer.parseInt(vars.get("attribute_" + attributeId + "_values_matchNr")); for (int j = 1; j <= valuesCount; j++) { attributeValue = vars.get("attribute_" + attributeId + "_values_" + j.toString()); ctx.getCurrentSampler().addArgument( "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][include]", "1" ); ctx.getCurrentSampler().addArgument( "product[configurable_attributes_data][" + attributeId + "][values][" + attributeValue + "][value_index]", attributeValue ); } } ctx.getCurrentSampler().addArgument("associated_product_ids_serialized", vars.get("associated_products_ids").toString()); } catch (Exception e) { log.error("error???", e); } You saved the product Assertion.response_data false 2 if have trouble see messages-message-error 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx continue false ${loops} ${csrPoolUsers} ${ramp_period} 1505803944000 1505803944000 false mpaf/tool/fragments/_system/thread_group.jmx 1 false 1 ${adminReturnsManagementPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Returns Management"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/orders_page.jmx Create New Order Assertion.response_data false 2 true sales_order_grid = true namespace true = true search true true = true filters[placeholder] true 200 = true paging[pageSize] true 1 = true paging[current] true increment_id = true sorting[field] true desc = true sorting[direction] true true = true isAjax true ${admin_form_key} = true form_key false true pending = true filters[status] true true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/open_orders.jmx totalRecords Assertion.response_data false 2 true ${admin_form_key} = true form_key true sales_order_grid = true namespace true true = true search true true true = true filters[placeholder] true true 200 = true paging[pageSize] true true 1 = true paging[current] true true increment_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true true pending = true filters[status] true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/search_orders.jmx totalRecords Assertion.response_data false 2 false order_numbers \"increment_id\":\"(\d+)\"\, $1$ -1 simple_products false order_ids \"entity_id\":\"(\d+)\"\, $1$ -1 simple_products mpaf/tool/fragments/ce/admin_create_process_returns/setup.jmx import java.util.ArrayList; import java.util.HashMap; import org.apache.jmeter.protocol.http.util.Base64Encoder; import java.util.Random; // get count of "order_numbers" variable defined in "Search Pending Orders Limit" int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); int clusterLength; int threadsNumber = ctx.getThreadGroup().getNumThreads(); if (threadsNumber == 0) { //Number of orders for one thread clusterLength = ordersCount; } else { clusterLength = Math.round(ordersCount / threadsNumber); if (clusterLength == 0) { clusterLength = 1; } } //Current thread number starts from 0 int currentThreadNum = ctx.getThreadNum(); //Index of the current product from the cluster Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } int iterator = random.nextInt(clusterLength); if (iterator == 0) { iterator = 1; } int i = clusterLength * currentThreadNum + iterator; orderNumber = vars.get("order_numbers_" + i.toString()); orderId = vars.get("order_ids_" + i.toString()); vars.put("order_number", orderNumber); vars.put("order_id", orderId); false 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/open_order.jmx #${order_number} Assertion.response_data false 2 false order_status <span id="order_status">([^<]+)</span> $1$ 1 simple_products "${order_status}" == "Pending" false mpaf/tool/fragments/ce/admin_edit_order/if_controller.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/invoice_start.jmx Invoice Totals Assertion.response_data false 2 false item_ids <div id="order_item_(\d+)_title"\s*class="product-title"> $1$ -1 simple_products true ${admin_form_key} = true form_key false true 1 = true invoice[items][${item_ids_1}] true 1 = true invoice[items][${item_ids_2}] true Invoiced = true invoice[comment_text] 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ POST true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx The invoice has been created Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_creditmemo/start/order_id/${order_id}/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/credit_memo_start.jmx New Memo Assertion.response_data false 2 true ${admin_form_key} = true form_key false true 1 = true creditmemo[items][${item_ids_1}][qty] true 1 = true creditmemo[items][${item_ids_2}][qty] true 1 = true creditmemo[do_offline] true Credit Memo added = true creditmemo[comment_text] true 10 = true creditmemo[shipping_amount] true 0 = true creditmemo[adjustment_positive] true 0 = true creditmemo[adjustment_negative] 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_creditmemo/save/order_id/${order_id}/ POST true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/credit_memo_full_refund.jmx You created the credit memo Assertion.response_data false 2 1 0 ${__javaScript(Math.round(${adminCreateProcessReturnsDelay}*1000))} mpaf/tool/fragments/ce/admin_create_process_returns/pause.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${browseCustomerGridPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Browse Customer Grid"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx vars.put("gridEntityType" , "Customer"); pagesCount = parseInt(vars.get("customers_page_size")) || 20; vars.put("grid_entity_page_size" , pagesCount); vars.put("grid_namespace" , "customer_listing"); vars.put("grid_admin_browse_filter_text" , vars.get("admin_browse_customer_filter_text")); vars.put("grid_filter_field", "name"); // set sort fields and sort directions vars.put("grid_sort_field_1", "name"); vars.put("grid_sort_field_2", "group_id"); vars.put("grid_sort_field_3", "billing_country_id"); vars.put("grid_sort_order_1", "asc"); vars.put("grid_sort_order_2", "desc"); javascript mpaf/tool/fragments/ce/admin_browse_customers_grid/setup.jmx mpaf/tool/fragments/ce/simple_controller.jmx true ${grid_namespace} = true namespace true true = true search true true true = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true 1 = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/set_pages_count.jmx $.totalRecords 0 true false true entity_total_records $.totalRecords BODY var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; var totalsRecord = parseInt(vars.get("entity_total_records")); var pageCount = Math.round(totalsRecord/pageSize); vars.put("grid_pages_count", pageCount); javascript true ${grid_namespace} = true namespace true true = true search true true ${grid_admin_browse_filter_text} = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true 1 = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/set_filtered_pages_count.jmx $.totalRecords 0 true false true true entity_total_records $.totalRecords BODY var pageSize = parseInt(vars.get("grid_entity_page_size")) || 20; var totalsRecord = parseInt(vars.get("entity_total_records")); var pageCount = Math.round(totalsRecord/pageSize); vars.put("grid_pages_count_filtered", pageCount); javascript 1 ${grid_pages_count} 1 page_number true false mpaf/tool/fragments/ce/admin_grid_browsing/select_page_number.jmx true ${grid_namespace} = true namespace true true = true search true true true = true filters[placeholder] true true ${grid_entity_page_size} = true paging[pageSize] true true ${page_number} = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_grid_browsing/admin_browse_grid.jmx \"totalRecords\":[^0]\d* Assertion.response_data false 2 1 ${grid_pages_count_filtered} 1 page_number true false mpaf/tool/fragments/ce/admin_grid_browsing/select_filtered_page_number.jmx mpaf/tool/fragments/ce/admin_grid_browsing/admin_browse_grid_sort_and_filter.jmx grid_sort_field grid_sort_field true 0 3 grid_sort_order grid_sort_order true 0 2 true ${grid_namespace} = true namespace false true ${grid_admin_browse_filter_text} = true filters[${grid_filter_field}] false true true = true filters[placeholder] false true ${grid_entity_page_size} = true paging[pageSize] false true ${page_number} = true paging[current] false true ${grid_sort_field} = true sorting[field] false true ${grid_sort_order} = true sorting[direction] false true true = true isAjax false 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false \"totalRecords\":[^0]\d* Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${adminCreateOrderPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Create Order"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx javascript vars.put("alabama_region_id", props.get("alabama_region_id")); vars.put("california_region_id", props.get("california_region_id")); mpaf/tool/fragments/ce/common/get_region_data.jmx mpaf/tool/fragments/ce/admin_create_order/admin_create_order.jmx import org.apache.jmeter.samplers.SampleResult; import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom}); } number = random.nextInt(props.get("simple_products_list").size()); simpleList = props.get("simple_products_list").get(number); vars.put("simple_product_1_url_key", simpleList.get("url_key")); vars.put("simple_product_1_name", simpleList.get("title")); vars.put("simple_product_1_id", simpleList.get("id")); do { number1 = random.nextInt(props.get("simple_products_list").size()); } while(number == number1); simpleList = props.get("simple_products_list").get(number1); vars.put("simple_product_2_url_key", simpleList.get("url_key")); vars.put("simple_product_2_name", simpleList.get("title")); vars.put("simple_product_2_id", simpleList.get("id")); number = random.nextInt(props.get("configurable_products_list").size()); configurableList = props.get("configurable_products_list").get(number); vars.put("configurable_product_1_url_key", configurableList.get("url_key")); vars.put("configurable_product_1_name", configurableList.get("title")); vars.put("configurable_product_1_id", configurableList.get("id")); vars.put("configurable_product_1_sku", configurableList.get("sku")); vars.put("configurable_attribute_id", configurableList.get("attribute_id")); vars.put("configurable_option_id", configurableList.get("attribute_option_id")); customers_index = 0; if (!props.containsKey("customer_ids_index")) { props.put("customer_ids_index", customers_index); } try { customers_index = props.get("customer_ids_index"); customers_list = props.get("customer_ids_list"); if (customers_index == customers_list.size()) { customers_index=0; } vars.put("customer_id", customers_list.get(customers_index)); props.put("customer_ids_index", ++customers_index); } catch (java.lang.Exception e) { log.error("Caught Exception in 'Admin Create Order' thread."); SampleResult.setStopThread(true); } true 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_create/start/ GET true false true false false Detected the start of a redirect chain Content-Type application/json Accept */* true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} 60000 200000 ${request_protocol} ${base_path}rest/V1/configurable-products/${configurable_product_1_sku}/options/all GET true false true false false attribute_ids $.[*].attribute_id NO_VALUE BODY option_values $.[*].values[0].value_index NO_VALUE BODY true item[${simple_product_1_id}][qty] 1 = true true item[${simple_product_2_id}][qty] 1 = true true item[${configurable_product_1_id}][qty] 1 = true true customer_id ${customer_id} = true true store_id 1 = true true currency_id = true true form_key ${admin_form_key} = true true payment[method] checkmo = true true reset_shipping 1 = true true json 1 = true true as_js_varname iFrameResponse = true true form_key ${admin_form_key} = true 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_create/loadBlock/block/search,items,shipping_method,totals,giftmessage,billing_method?isAjax=true POST true false true false false Detected the start of a redirect chain false try { attribute_ids = vars.get("attribute_ids"); option_values = vars.get("option_values"); attribute_ids = attribute_ids.replace("[","").replace("]","").replace("\"", ""); option_values = option_values.replace("[","").replace("]","").replace("\"", ""); attribute_ids_array = attribute_ids.split(","); option_values_array = option_values.split(","); args = ctx.getCurrentSampler().getArguments(); it = args.iterator(); while (it.hasNext()) { argument = it.next(); if (argument.getStringValue().contains("${")) { args.removeArgument(argument.getName()); } } for (int i = 0; i < attribute_ids_array.length; i++) { ctx.getCurrentSampler().addArgument("item[" + vars.get("configurable_product_1_id") + "][super_attribute][" + attribute_ids_array[i] + "]", option_values_array[i]); } } catch (Exception e) { log.error("error???", e); } true collect_shipping_rates 1 = true true customer_id ${customer_id} = true true store_id 1 = true true currency_id false = true true form_key ${admin_form_key} = true true payment[method] checkmo = true true json true = true 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_create/loadBlock/block/shipping_method,totals?isAjax=true POST true false true false false shipping_method Flat Rate Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_create/index/ GET true false true false false Detected the start of a redirect chain Select from existing customer addresses Submit Order Items Ordered Assertion.response_data false 2 true form_key ${admin_form_key} = true true limit 20 = true true entity_id = true true name = true true email = true true Telephone = true true billing_postcode = true true billing_country_id = true true billing_regione = true true store_name = true true page 1 = true true order[currency] USD = true true sku = true true qty = true true limit 20 = true true entity_id = true true name = true true sku = true true price[from] = true true price[to] = true true in_products = true true page 1 = true true coupon_code = true true order[account][group_id] 1 = true true order[account][email] user_${customer_id}@example.com = true true order[billing_address][customer_address_id] = true true order[billing_address][prefix] = true true order[billing_address][firstname] Anthony = true true order[billing_address][middlename] = true true order[billing_address][lastname] Nealy = true true order[billing_address][suffix] = true true order[billing_address][company] = true true order[billing_address][street][0] 123 Freedom Blvd. #123 = true true order[billing_address][street][1] = true true order[billing_address][city] Fayetteville = true true order[billing_address][country_id] US = true true order[billing_address][region] = true true order[billing_address][region_id] ${alabama_region_id} = true true order[billing_address][postcode] 123123 = true true order[billing_address][telephone] 022-333-4455 = true true order[billing_address][fax] = true true order[billing_address][vat_id] = true true shipping_same_as_billing on = true true payment[method] checkmo = true true order[shipping_method] flatrate_flatrate = true true order[comment][customer_note] = true true order[comment][customer_note_notify] 1 = true true order[send_confirmation] 1 = true 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_create/save/ POST true false true true false Detected the start of a redirect chain false order_id ${host}${base_path}${admin_path}/sales/order/index/order_id/(\d+)/ $1$ 1 false order_item_1 order_item_(\d+)_title $1$ 1 false order_item_2 order_item_(\d+)_title $1$ 2 false order_item_3 order_item_(\d+)_title $1$ 3 ^\d+$ Assertion.response_data false 1 variable order_id ^\d+$ Assertion.response_data false 1 variable order_item_1 ^\d+$ Assertion.response_data false 1 variable order_item_2 ^\d+$ Assertion.response_data false 1 variable order_item_3 You created the order. Assertion.response_data false 2 true form_key ${admin_form_key} = true true invoice[items][${order_item_1}] 1 = true true invoice[items][${order_item_2}] 1 = true true invoice[items][${order_item_3}] 1 = true true invoice[comment_text] = true 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ POST true false true false false Detected the start of a redirect chain The invoice has been created. Assertion.response_data false 2 true form_key ${admin_form_key} = true true shipment[items][${order_item_1}] 1 = true true shipment[items][${order_item_2}] 1 = true true shipment[items][${order_item_3}] 1 = true true shipment[comment_text] = true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ POST true false true false false Detected the start of a redirect chain The shipment has been created. Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx continue false ${loops} ${apiPoolUsers} ${ramp_period} 1505803944000 1505803944000 false mpaf/tool/fragments/_system/thread_group.jmx 1 false 1 ${apiBasePercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API"); true Content-Type application/json Accept */* mpaf/tool/fragments/ce/api/header_manager_before_token.jmx true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false mpaf/tool/fragments/ce/api/admin_token_retrieval.jmx admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} mpaf/tool/fragments/ce/api/header_manager.jmx 1 false 1 100 mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API Create Customer"); true true false { "customer": { "email": "customer_${__time()}-${__threadNum}-${__Random(1,1000000)}@example.com", "firstname": "test_${__time()}-${__threadNum}-${__Random(1,1000000)}", "lastname": "Doe" }, "password": "test@123" } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/customers POST true false true false false mpaf/tool/fragments/ce/api/create_customer.jmx customer_id $.id BODY ^\d+$ Assertion.response_data false 1 variable customer_id 60000 200000 ${request_protocol} ${base_path}rest/default/V1/customers/${customer_id} GET true false true false false mpaf/tool/fragments/ce/api/check_customer.jmx $.id ${customer_id} true false false 1 false 1 100 mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API Catalog Browsing"); true 60000 200000 ${request_protocol} ${base_path}rest/default/V1/categories GET true false true false false mpaf/tool/fragments/ce/api/get_categories.jmx errors Assertion.response_data false 6 variable search_category_id $.id BODY ^\d+$ Assertion.response_data false 1 variable search_category_id 60000 200000 ${request_protocol} ${base_path}rest/default/V1/categories/${search_category_id} GET true false true false false mpaf/tool/fragments/ce/api/get_category.jmx errors Assertion.response_data false 6 variable true 20 = true searchCriteria[page_size] true true 1 = true searchCriteria[current_page] true 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products GET true false true false false mpaf/tool/fragments/ce/api/get_products.jmx errors Assertion.response_data false 6 variable 1 false 1 100 mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API Search"); true true quick_search_container = true searchCriteria[request_name] true search_term = true searchCriteria[filter_groups][0][filters][0][field] true Simple = true searchCriteria[filter_groups][0][filters][0][value] true 20 = true searchCriteria[page_size] true 1 = true searchCriteria[current_page] 60000 200000 ${request_protocol} ${base_path}rest/default/V1/search GET true false true false false mpaf/tool/fragments/ce/api/search_for_product_frontend.jmx $.total_count 0 true false true search_product_id $.items[0].id BODY ^\d+$ Assertion.response_data false 1 variable search_product_id 1 false 1 100 mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API Checkout"); true javascript vars.put("alabama_region_id", props.get("alabama_region_id")); vars.put("california_region_id", props.get("california_region_id")); mpaf/tool/fragments/ce/common/get_region_data.jmx mpaf/tool/fragments/ce/common/init_random_generator_setup.jmx import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } vars.putObject("randomIntGenerator", random); true import java.util.Random; Random random = vars.getObject("randomIntGenerator"); number = random.nextInt(props.get("simple_products_list").size()); product = props.get("simple_products_list").get(number); vars.put("product_url_key", product.get("url_key")); vars.put("product_id", product.get("id")); vars.put("product_name", product.get("title")); vars.put("product_uenc", product.get("uenc")); vars.put("product_sku", product.get("sku")); true mpaf/tool/fragments/ce/product_browsing_and_adding_items_to_the_cart/simple_products_setup.jmx 60000 200000 ${request_protocol} ${base_path}rest/default/V1/carts POST true false true false false mpaf/tool/fragments/ce/api/create_quote.jmx quote_id $ BODY ^\d+$ Assertion.response_data false 1 variable quote_id true false { "cartItem": { "sku": "${product_sku}", "qty":"1", "quote_id":"${quote_id}" } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/carts/${quote_id}/items POST true false true false false mpaf/tool/fragments/ce/api/add_product_to_quote_hardwired_sku.jmx $.sku ${product_sku} true false false 60000 200000 ${request_protocol} ${base_path}rest/default/V1/carts/${quote_id}/items GET true false true false false mpaf/tool/fragments/ce/api/check_product_in_quote_hardwired_sku.jmx $[0].sku ${product_sku} true false false true false { "storeId": 1 } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/ POST true false true false false mpaf/tool/fragments/ce/api/create_guest_cart.jmx cart_id $ BODY ^.+$ Assertion.response_data false 1 variable cart_id true false { "cartItem": { "sku": "${product_sku}", "qty":"1", "quote_id":"${cart_id}" } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/items POST true false true false false mpaf/tool/fragments/ce/api/add_product_to_guest_cart_hardwired_sku.jmx $.quote_id ^[a-z0-9-]+$ true false false true false { "sender": "John Doe", "recipient": "Jane Roe", "giftMessage": "Gift Message Text" } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/gift-message POST true false true false false mpaf/tool/fragments/ce/api/add_gift_message_to_guest_cart.jmx $ true true false false true false {"address":{"country_id":"US","postcode":"95630"}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/estimate-shipping-methods POST true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_estimate_shipping_methods_with_postal_code.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json "available":true Assertion.response_data false 2 true false {"addressInformation":{"shipping_address":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname"},"shipping_method_code":"flatrate","shipping_carrier_code":"flatrate"}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/shipping-information POST true false true false false mpaf/tool/fragments/ce/guest_checkout/checkout_billing_shipping_information.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json {"payment_methods": Assertion.response_data false 2 true false {"cartId":"${cart_id}","email":"test@example.com","paymentMethod":{"method":"checkmo","po_number":null,"additional_data":null},"billingAddress":{"countryId":"US","regionId":"${california_region_id}","regionCode":"CA","region":"California","street":["10441 Jefferson Blvd ste 200"],"company":"","telephone":"3109450345","fax":"","postcode":"90232","city":"Culver City","firstname":"Name","lastname":"Lastname","save_in_address_book":0}} = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/guest-carts/${cart_id}/payment-information POST true false true false false mpaf/tool/fragments/ce/api/checkout_payment_info_place_order.jmx Referer ${base_path}checkout/onepage/ Content-Type application/json; charset=UTF-8 X-Requested-With XMLHttpRequest Accept application/json "[0-9]+" Assertion.response_data false 2 order_id $ BODY ^\d+$ Assertion.response_data false 1 variable order_id 1 false 1 100 mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API Product Management"); true true false { "product": { "sku": "psku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", "name": "Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", "attributeSetId": 4 } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false mpaf/tool/fragments/ce/api/create_product_no_custom_attributes.jmx simple_product_id $.id BODY simple_product_sku $.sku BODY simple_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable simple_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable simple_product_sku ^\d+$ Assertion.response_data false 1 variable simple_stock_item_id true false { "stock_item": { "manage_stock": 1, "is_in_stock": 1, "qty": ${simple_product_id} } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/${simple_product_sku}/stockItems/${simple_stock_item_id} PUT true false true false false mpaf/tool/fragments/ce/api/update_product_stock_info.jmx $ ${simple_stock_item_id} true false false true true = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/${simple_product_sku} GET true false true false false mpaf/tool/fragments/ce/api/check_product.jmx $.sku ${simple_product_sku} true false false $.id ${simple_product_id} true false false $.extension_attributes.stock_item.item_id ${simple_stock_item_id} true false false $.extension_attributes.stock_item.qty ${simple_product_id} true false false true false { "product": { "sku": "apsku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", "name": "Extensible_Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", "visibility": "4", "type_id": "simple", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time()}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":0, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCABgAGADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3+iioLy8t9Ps5bu7lWKCIZd26KKaTbshpX0RPRXN/8J/4V/6DVv8Ak3+FH/Cf+Ff+g1b/AJN/hXR9SxP/AD7l9zNPYVf5X9x0lFc3/wAJ/wCFf+g1b/k3+FH/AAn/AIV/6DVv+Tf4UfUsT/z7l9zD2FX+V/cdJRXN/wDCf+Ff+g1b/k3+FH/Cf+Ff+g1b/k3+FH1LE/8APuX3MPYVf5X9x0lFc3/wn/hX/oNW/wCTf4Uf8J/4V/6DVv8Ak3+FH1LE/wDPuX3MPYVf5X9x0lFVdP1G01WyS8sZ1nt3JCyL0ODg/qKtVzyi4u0lZmbTTswrm/H3/Iiav/1x/wDZhXSVzfj7/kRNX/64/wDswrowf+80/wDEvzNKH8WPqj5voorB1zS7OLT7m7SHE5YNu3HqWGeM471+kYutOhSdSEU7Jt3dtF20f6H1FacqcHJK9vO36M3qKzTa6foqPdxwlWxswrFi2T0AJ9aRdVmjkT7XYSW8TsFEm8MAT0yB0qfrcafu1tJeV2l2u7K3zsL2yjpPR+V3+NjTorPn1GVbt7a1s2uJIwDJ84ULnpyaik1SWTTrp47Z0uIQRJGzAFOPvZ70Sx1GLau9L9H03SdrNrsgdeCuu3k+hq0VR0ma4msImuIih2LtYvuLjA+b2zV6uijUVWmprqaQkpxUl1PoP4Xf8iBYf78v/oxq7GuO+F3/ACIFh/vy/wDoxq7GvzTMf98q/wCJ/mfLYn+NP1YVzfj7/kRNX/64/wDswrpK5vx9/wAiJq//AFx/9mFRg/8Aeaf+JfmTQ/ix9UfN9ZniD/kB3H/Af/QhWnTZI45kKSIroeqsMg1+l4mk61GdNfaTX3o+pqw54Sj3Rma/GXsI3BcLFMruU+8F5yR+dUZ4tOeNFOq3tx5jACNZg5J+mK6PrUMdrbxPvjgiR/7yoAa48TgPa1HNW1STvfp2s1+JjVw/PJy017mbe/YTqTB7iWzuQgPmhtocfjwajiupbjTtTieUXCxRsqTKMb8qePwrYlghnAE0UcgHQOoP86ckaRoERFVR/CowKbwU3UclJJO+19brqr203vvoHsJczd7J3/H8PmVNJnhm063WOVHZIkDhTkqcd/yNXajighg3eTFHHu67FAz+VSV2UIShTjGe67G9NOMUpbn0H8Lv+RAsP9+X/wBGNXY1x3wu/wCRAsP9+X/0Y1djX5tmP++Vf8T/ADPl8T/Gn6sK5vx9/wAiJq//AFx/9mFdJXN+Pv8AkRNX/wCuP/swqMH/ALzT/wAS/Mmh/Fj6o+b6KKK/Uj60KKKKACiiigAooooA+g/hd/yIFh/vy/8Aoxq7GuO+F3/IgWH+/L/6Mauxr8wzH/fKv+J/mfKYn+NP1YVzfj7/AJETV/8Arj/7MK6Sub8ff8iJq/8A1x/9mFRg/wDeaf8AiX5k0P4sfVHzfRRRX6kfWhRRRQAUUUUAFFFFAH0H8Lv+RAsP9+X/ANGNXY1x3wu/5ECw/wB+X/0Y1djX5hmP++Vf8T/M+UxP8afqwqC8s7fULOW0u4llglGHRujCp6K5E2ndGKdtUc3/AMIB4V/6Atv+bf40f8IB4V/6Atv+bf410lFdH13E/wDPyX3s09vV/mf3nN/8IB4V/wCgLb/m3+NH/CAeFf8AoC2/5t/jXSUUfXcT/wA/Jfew9vV/mf3nN/8ACAeFf+gLb/m3+NH/AAgHhX/oC2/5t/jXSUUfXcT/AM/Jfew9vV/mf3nN/wDCAeFf+gLb/m3+NH/CAeFf+gLb/m3+NdJRR9dxP/PyX3sPb1f5n95V0/TrTSrJLOxgWC3QkrGvQZOT+pq1RRXPKTk7yd2Zttu7P//Z", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false mpaf/tool/fragments/ce/api/create_product_with_extensible_data_objects.jmx simple_product_id $.id BODY simple_product_sku $.sku BODY simple_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable simple_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable simple_product_sku ^\d+$ Assertion.response_data false 1 variable simple_stock_item_id true true = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/${simple_product_sku} GET true false true false false mpaf/tool/fragments/ce/api/check_product_with_extensible_data_objects.jmx $.sku ${simple_product_sku} true false false $.id ${simple_product_id} true false false $.extension_attributes.stock_item.item_id ${simple_stock_item_id} true false false $.extension_attributes.stock_item.qty 100 true false false continue false ${loops} ${deadLocksPoolUsers} ${ramp_period} 1505803944000 1505803944000 false mpaf/tool/fragments/_system/thread_group.jmx 1 false 1 ${productGridMassActionPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Product Grid Mass Actions"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx true ${admin_form_key} = true form_key true product_listing = true namespace true true = true search true true true = true filters[placeholder] true true 20 = true paging[pageSize] true true 1 = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_browse_products_grid/get_product_pages_count.jmx $.totalRecords 0 true false true products_number $.totalRecords BODY false var productsPageSize = Integer.parseInt(vars.get("products_page_size")); var productsTotal = Integer.parseInt(vars.get("products_number")); var pageCountProducts = Math.round(productsTotal/productsPageSize); vars.put("pages_count_product", String.valueOf(pageCountProducts)); import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom}); } var productsPageSize = Integer.parseInt(vars.get("products_page_size")); var totalNumberOfPages = Integer.parseInt(vars.get("pages_count_product")); // Randomly select a page. var randomProductsPage = random.nextInt(totalNumberOfPages) + 1; // Get the first and last product id on that page. var lastProductIdOnPage = randomProductsPage * productsPageSize; var firstProductIdOnPage = lastProductIdOnPage - productsPageSize + 1; var randomProductId1 = Math.floor(random.nextInt(productsPageSize)) + firstProductIdOnPage; var randomProductId2 = Math.floor(random.nextInt(productsPageSize)) + firstProductIdOnPage; var randomProductId3 = Math.floor(random.nextInt(productsPageSize)) + firstProductIdOnPage; vars.put("page_number", String.valueOf(randomProductsPage)); vars.put("productId1", String.valueOf(randomProductId1)); vars.put("productId2", String.valueOf(randomProductId2)); vars.put("productId3", String.valueOf(randomProductId3)); var randomQuantity = random.nextInt(1000) + 1; var randomPrice = random.nextInt(500) + 10; var randomVisibility = random.nextInt(4) + 1; vars.put("quantity", String.valueOf(randomQuantity)); vars.put("price", String.valueOf(randomPrice)); vars.put("visibility", String.valueOf(randomVisibility)); false mpaf/tool/fragments/ce/admin_browse_products_grid/products_grid_mass_actions/setup.jmx true ${admin_form_key} = true form_key true true product_listing = true namespace true true = true search true true true = true filters[placeholder] true true ${products_page_size} = true paging[pageSize] true true ${page_number} = true paging[current] true true entity_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_browse_products_grid/products_grid_mass_actions/display_grid.jmx totalRecords Assertion.response_data false 2 true ${productId1} = true selected[0] true ${productId2} = true selected[1] true ${productId3} = true selected[2] true true true = true filters[placeholder] false true ${admin_form_key} = true form_key false true product_listing = true namespace false 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product_action_attribute/edit GET true false true false false mpaf/tool/fragments/ce/admin_browse_products_grid/products_grid_mass_actions/display_update_attributes.jmx Update Attributes Assertion.response_data false 2 true true = true isAjax true true ${admin_form_key} = true form_key true true 1 = true product[product_has_weight] true true 1 = true product[use_config_gift_message_available] true true 1 = true product[use_config_gift_wrapping_available] true true ${quantity} = true inventory[qty] true true ${price} = true attributes[price] true ${visibility} = true attributes[visibility] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product_action_attribute/validate POST true false true false false mpaf/tool/fragments/ce/admin_browse_products_grid/products_grid_mass_actions/change_attributes.jmx {"error":false} Assertion.response_data false 2 true true = true isAjax false true ${admin_form_key} = true form_key false true 1 = true product[product_has_weight] true true 1 = true product[use_config_gift_message_available] true 1 = true product[use_config_gift_wrapping_available] true true ${quantity} = true inventory[qty] true on = true toggle_price true true ${price} = true attributes[price] true on = true toggle_price true true ${visibility} = true attributes[visibility] true on = true toggle_visibility true 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product_action_attribute/save/store/0/active_tab/attributes POST true false true true false were updated. Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${importProductsPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Import Products"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx vars.put("entity", "catalog_product"); String behavior = "${adminImportProductBehavior}"; vars.put("adminImportBehavior", behavior); String filepath = "${files_folder}${adminImportProductFilePath}"; vars.put("adminImportFilePath", filepath); true mpaf/tool/fragments/ce/import_products/setup.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/import/ GET true false true false false mpaf/tool/fragments/ce/common/import.jmx Import Settings Assertion.response_data false 2 true ${admin_form_key} = true form_key false true ${entity} = true entity true ${adminImportBehavior} = true behavior true validation-stop-on-errors = true validation_strategy true 10 = true allowed_error_count true , = true _import_field_separator true , = true _import_multiple_value_separator 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/import/validate POST true false true false HttpClient4 ${adminImportFilePath} import_file application/vnd.ms-excel false mpaf/tool/fragments/ce/common/import_validate.jmx File is valid! To start import process Assertion.response_data false 16 true ${admin_form_key} = true form_key false true ${entity} = true entity true ${adminImportBehavior} = true behavior true validation-stop-on-errors = true validation_strategy false true 10 = true allowed_error_count false true , = true _import_field_separator false true , = true _import_multiple_value_separator false 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/import/start POST true false true false HttpClient4 ${adminImportFilePath} import_file application/vnd.ms-excel false mpaf/tool/fragments/ce/common/import_save.jmx Import successfully done Assertion.response_data false 16 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${importCustomersPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Import Customers"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx vars.put("entity", "customer"); String behavior = "${adminImportCustomerBehavior}"; vars.put("adminImportBehavior", behavior); String filepath = "${files_folder}${adminImportCustomerFilePath}"; vars.put("adminImportFilePath", filepath); true mpaf/tool/fragments/ce/import_customers/setup.jmx mpaf/tool/fragments/ce/simple_controller.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/import/ GET true false true false false mpaf/tool/fragments/ce/common/import.jmx Import Settings Assertion.response_data false 2 true ${admin_form_key} = true form_key false true ${entity} = true entity true ${adminImportBehavior} = true behavior true validation-stop-on-errors = true validation_strategy true 10 = true allowed_error_count true , = true _import_field_separator true , = true _import_multiple_value_separator 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/import/validate POST true false true false HttpClient4 ${adminImportFilePath} import_file application/vnd.ms-excel false mpaf/tool/fragments/ce/common/import_validate.jmx File is valid! To start import process Assertion.response_data false 16 true ${admin_form_key} = true form_key false true ${entity} = true entity true ${adminImportBehavior} = true behavior true validation-stop-on-errors = true validation_strategy false true 10 = true allowed_error_count false true , = true _import_field_separator false true , = true _import_multiple_value_separator false 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/import/start POST true false true false HttpClient4 ${adminImportFilePath} import_file application/vnd.ms-excel false mpaf/tool/fragments/ce/common/import_save.jmx Import successfully done Assertion.response_data false 16 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${exportProductsPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Export Products"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/export/ GET true false true false false mpaf/tool/fragments/ce/common/export.jmx Export Settings Assertion.response_data false 2 true form_key ${admin_form_key} = true true attribute_code = true true export_filter[allow_message][] , = true true export_filter[allow_open_amount] = true true export_filter[category_ids] 24,25,26,27,28,29,30 = true true export_filter[configurable_variations] = true true export_filter[cost][] , = true true export_filter[country_of_manufacture] = true true export_filter[created_at] = true true export_filter[custom_design] = true true export_filter[custom_design_from][] , = true true export_filter[custom_design_to][] , = true true export_filter[custom_layout_update] = true true export_filter[description] = true true export_filter[email_template] = true true export_filter[gallery] = true true export_filter[gift_message_available] = true true export_filter[gift_wrapping_available] = true true export_filter[gift_wrapping_price][] , = true true export_filter[group_price][] , = true true export_filter[has_options] = true true export_filter[image] = true true export_filter[image_label] = true true export_filter[is_redeemable][] , = true true export_filter[is_returnable] = true true export_filter[lifetime][] , = true true export_filter[links_exist][] , = true true export_filter[links_purchased_separately][] , = true true export_filter[links_title] = true true export_filter[media_gallery] = true true export_filter[meta_description] = true true export_filter[meta_keyword] = true true export_filter[meta_title] = true true export_filter[minimal_price][] , = true true export_filter[msrp][] , = true true export_filter[msrp_display_actual_price_type] = true true export_filter[name] = true true export_filter[news_from_date][] , = true true export_filter[news_to_date][] , = true true export_filter[old_id][] , = true true export_filter[open_amount_max][] , = true true export_filter[open_amount_min][] , = true true export_filter[options_container] = true true export_filter[page_layout] = true true export_filter[price][] , = true true export_filter[price_type][] , = true true export_filter[price_view] = true true export_filter[quantity_and_stock_status] = true true export_filter[related_tgtr_position_behavior][] , = true true export_filter[related_tgtr_position_limit][] , = true true export_filter[required_options] = true true export_filter[samples_title] = true true export_filter[shipment_type][] , = true true export_filter[short_description] = true true export_filter[sku] = true true export_filter[sku_type][] , = true true export_filter[small_image] = true true export_filter[small_image_label] = true true export_filter[special_from_date][] , = true true export_filter[special_price][] , = true true export_filter[special_to_date][] , = true true export_filter[status] = true true export_filter[tax_class_id] = true true export_filter[thumbnail] = true true export_filter[thumbnail_label] = true true export_filter[tier_price][] , = true true export_filter[updated_at] = true true export_filter[upsell_tgtr_position_behavior][] , = true true export_filter[upsell_tgtr_position_limit][] , = true true export_filter[url_key] = true true export_filter[url_path] = true true export_filter[use_config_allow_message][] , = true true export_filter[use_config_email_template][] , = true true export_filter[use_config_is_redeemable][] , = true true export_filter[use_config_lifetime][] , = true true export_filter[visibility] = true true export_filter[weight][] , = true true export_filter[weight_type][] , = true true frontend_label = true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/export/export/entity/catalog_product/file_format/csv POST true false true false false mpaf/tool/fragments/ce/export_products/export_products.jmx Simple Product 1 Assertion.response_data false 16 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${exportCustomersPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Export Customers"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/export/ GET true false true false false mpaf/tool/fragments/ce/common/export.jmx Export Settings Assertion.response_data false 2 true ${admin_form_key} = true form_key false true = true attribute_code true true = true export_filter[confirmation] true true = true export_filter[created_at] true true = true export_filter[created_in] true true , = true export_filter[default_billing][] true true , = true export_filter[default_shipping][] true true = true export_filter[disable_auto_group_change] true true , = true export_filter[dob][] true true = true export_filter[email] true true = true export_filter[firstname] true true = true export_filter[gender] true true = true export_filter[group_id] true true = true export_filter[lastname] true true = true export_filter[middlename] true true = true export_filter[password_hash] true true = true export_filter[prefix] true true , = true export_filter[reward_update_notification][] true true , = true export_filter[reward_warning_notification][] true true = true export_filter[rp_token] true true , = true export_filter[rp_token_created_at][] true true = true export_filter[store_id] true true = true export_filter[suffix] true true = true export_filter[taxvat] true true = true export_filter[website_id] true true = true frontend_label true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/export/export/entity/customer/file_format/csv POST true false true false false mpaf/tool/fragments/ce/export_customers/export_customers.jmx user_1@example.com Assertion.response_data false 16 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${apiBasePercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API"); true Content-Type application/json Accept */* mpaf/tool/fragments/ce/api/header_manager_before_token.jmx true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false mpaf/tool/fragments/ce/api/admin_token_retrieval.jmx admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} mpaf/tool/fragments/ce/api/header_manager.jmx 1 false 1 100 mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API Process Orders"); true // Each thread gets an equal number of orders, based on how many orders are available. int apiProcessOrders = Integer.parseInt("${apiProcessOrders}"); if (apiProcessOrders > 0) { ordersPerThread = apiProcessOrders; } else { ordersPerThread = 1; } threadNum = ${__threadNum}; vars.put("ordersPerThread", String.valueOf(ordersPerThread)); vars.put("threadNum", String.valueOf(threadNum)); false mpaf/tool/fragments/ce/api/process_orders/setup.jmx true status = true searchCriteria[filterGroups][0][filters][0][field] true Pending = true searchCriteria[filterGroups][0][filters][0][value] true ${ordersPerThread} = true searchCriteria[pageSize] true ${threadNum} = true searchCriteria[current_page] 60000 200000 ${request_protocol} ${base_path}rest/default/V1/orders GET true false true false false mpaf/tool/fragments/ce/api/process_orders/get_orders.jmx entity_ids $.items[*].entity_id BODY entity_ids order_id true mpaf/tool/fragments/ce/api/process_orders/for_each_order.jmx 60000 200000 ${request_protocol} ${base_path}rest/default/V1/order/${order_id}/invoice POST true false true false false mpaf/tool/fragments/ce/api/process_orders/create_invoice.jmx "\d+" Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}rest/default/V1/order/${order_id}/ship POST true false true false false mpaf/tool/fragments/ce/api/process_orders/create_shipment.jmx "\d+" Assertion.response_data false 2 1 false 1 100 mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "API Product Attribute Management"); true true false { "attributeSet": { "attribute_set_name": "new_attribute_set_${__time()}-${__threadNum}-${__Random(1,1000000)}", "sort_order": 500 }, "skeletonId": "4" } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/attribute-sets/ POST true false true false false mpaf/tool/fragments/ce/api/create_attribute_set.jmx attribute_set_id $.attribute_set_id BODY ^\d+$ Assertion.response_data false 1 variable attribute_set_id true false { "group": { "attribute_group_name": "empty_attribute_group_${__time()}-${__threadNum}-${__Random(1,1000000)}", "attribute_set_id": ${attribute_set_id} } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/attribute-sets/groups POST true false true false false mpaf/tool/fragments/ce/api/create_attribute_group.jmx attribute_group_id $.attribute_group_id BODY ^\d+$ Assertion.response_data false 1 variable attribute_set_id true false { "attribute": { "attribute_code": "attr_code_${__time()}", "frontend_labels": [ { "store_id": 0, "label": "front_lbl_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}" } ], "default_value": "default value", "frontend_input": "textarea", "is_required": 1 } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/attributes/ POST true false true false false mpaf/tool/fragments/ce/api/create_attribute.jmx attribute_id $.attribute_id BODY attribute_code $.attribute_code BODY ^\d+$ Assertion.response_data false 1 variable attribute_id ^[a-z0-9-_]+$ Assertion.response_data false 1 variable attribute_code true false { "attributeSetId": "${attribute_set_id}", "attributeGroupId": "${attribute_group_id}", "attributeCode": "${attribute_code}", "sortOrder": 3 } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/attribute-sets/attributes POST true false true false false mpaf/tool/fragments/ce/api/add_attribute_to_attribute_set.jmx $ (\d+) true false false 1 false 1 ${adminCategoryManagementPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Category Management"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx mpaf/tool/fragments/ce/admin_category_management/admin_category_management.jmx javascript random = new java.util.Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } /** * Get unique ids for fix concurrent category saving */ function getNextProductNumber(i) { number = productsVariationsSize * ${__threadNum} - i; if (number >= productsSize) { log.info("${testLabel}: capacity of product list is not enough for support all ${adminPoolUsers} threads"); return random.nextInt(productsSize); } return productsVariationsSize * ${__threadNum} - i; } var productsVariationsSize = 5, productsSize = props.get("simple_products_list_for_edit").size(); for (i = 1; i<= productsVariationsSize; i++) { var productVariablePrefix = "simple_product_" + i + "_"; number = getNextProductNumber(i); simpleList = props.get("simple_products_list_for_edit").get(number); vars.put(productVariablePrefix + "url_key", simpleList.get("url_key")); vars.put(productVariablePrefix + "id", simpleList.get("id")); vars.put(productVariablePrefix + "name", simpleList.get("title")); } categoryIndex = random.nextInt(props.get("admin_category_ids_list").size()); vars.put("parent_category_id", props.get("admin_category_ids_list").get(categoryIndex)); do { categoryIndexNew = random.nextInt(props.get("admin_category_ids_list").size()); } while(categoryIndex == categoryIndexNew); vars.put("new_parent_category_id", props.get("admin_category_ids_list").get(categoryIndexNew)); 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/category/ GET true false true false false Accept-Language en-US,en;q=0.5 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept-Encoding gzip, deflate false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/category/edit/id/${parent_category_id}/ GET true false true false false Accept-Language en-US,en;q=0.5 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept-Encoding gzip, deflate 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/category/add/store/0/parent/${parent_category_id} GET true false true false false <title>New Category Assertion.response_data false 2 true = true id true ${parent_category_id} = true parent true = true path true = true store_id true 0 = true is_active true 0 = true include_in_menu true 1 = true is_anchor true true = true use_config[available_sort_by] true true = true use_config[default_sort_by] true true = true use_config[filter_price_range] true false = true use_default[url_key] true 0 = true url_key_create_redirect true 0 = true custom_use_parent_settings true 0 = true custom_apply_to_products true Admin Category Management ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true name true admin-category-management-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true url_key true = true meta_title true = true description true PRODUCTS = true display_mode true position = true default_sort_by true = true meta_keywords true = true meta_description true = true custom_layout_update false {"${simple_product_1_id}":"","${simple_product_2_id}":"","${simple_product_3_id}":"","${simple_product_4_id}":"","${simple_product_5_id}":""} = true category_products true ${admin_form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/category/save/ POST true false true false false URL admin_category_id /catalog/category/edit/id/(\d+)/ $1$ 1 ^\d+$ Assertion.response_data false 1 variable admin_category_id 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/category/edit/id/${admin_category_id}/ GET true false true false false Accept-Language en-US,en;q=0.5 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept-Encoding gzip, deflate false admin_category_entity_id "entity_id":"([^"]+)" $1$ 1 false admin_category_attribute_set_id "attribute_set_id":"([^"]+)" $1$ 1 false admin_category_parent_id "parent_id":"([^"]+)" $1$ 1 false admin_category_created_at "created_at":"([^"]+)" $1$ 1 false admin_category_updated_at "updated_at":"([^"]+)" $1$ 1 false admin_category_path "entity_id":(.+)"path":"([^\"]+)" $2$ 1 false admin_category_level "level":"([^"]+)" $1$ 1 false admin_category_name "entity_id":(.+)"name":"([^"]+)" $2$ 1 false admin_category_url_key "url_key":"([^"]+)" $1$ 1 false admin_category_url_path "url_path":"([^"]+)" $1$ 1 ^\d+$ Assertion.response_data false 1 variable admin_category_entity_id ^\d+$ Assertion.response_data false 1 variable admin_category_attribute_set_id ^\d+$ Assertion.response_data false 1 variable admin_category_parent_id ^.+$ Assertion.response_data false 1 variable admin_category_created_at ^.+$ Assertion.response_data false 1 variable admin_category_updated_at ^[\d\\\/]+$ Assertion.response_data false 1 variable admin_category_path ^\d+$ Assertion.response_data false 1 variable admin_category_level ^.+$ Assertion.response_data false 1 variable admin_category_name ^.+$ Assertion.response_data false 1 variable admin_category_url_key ^.+$ Assertion.response_data false 1 variable admin_category_url_path ${simple_product_1_name} ${simple_product_2_name} ${simple_product_3_name} ${simple_product_4_name} ${simple_product_5_name} Assertion.response_data false 2 true ${admin_category_id} = true id true ${admin_form_key} = true form_key true append = true point true ${new_parent_category_id} = true pid true ${parent_category_id} = true paid true 0 = true aid true true = true isAjax 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/category/move/ POST true false true false false true ${admin_form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/category/delete/id/${admin_category_id}/ POST true false true false false You deleted the category. Assertion.response_data false 2 1 0 ${__javaScript(Math.round(${adminCategoryManagementDelay}*1000))} 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${adminPromotionRulesPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Promotion Rules"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx mpaf/tool/fragments/ce/admin_promotions_management/admin_promotions_management.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales_rule/promo_quote/ GET true false true false false 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales_rule/promo_quote/new GET true false true false false true true = true isAjax true ${admin_form_key} = true form_key true true 1--1 = true id true Magento\SalesRule\Model\Rule\Condition\Address|base_subtotal = true type 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales_rule/promo_quote/newConditionHtml/form/sales_rule_formrule_conditions_fieldset_/form_namespace/sales_rule_form POST true false true false false true Rule Name ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true name true 0 = true is_active true 0 = true use_auto_generation true 1 = true is_rss true 0 = true apply_to_shipping true 0 = true stop_rules_processing true = true coupon_code true = true uses_per_coupon true = true uses_per_customer true = true sort_order true 5 = true discount_amount true 0 = true discount_qty true = true discount_step true = true reward_points_delta true = true store_labels[0] true Rule Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true description true 1 = true coupon_type true cart_fixed = true simple_action true 1 = true website_ids[0] true 0 = true customer_group_ids[0] true = true from_date true = true to_date true Magento\SalesRule\Model\Rule\Condition\Combine = true rule[conditions][1][type] true all = true rule[conditions][1][aggregator] true 1 = true rule[conditions][1][value] true Magento\SalesRule\Model\Rule\Condition\Address = true rule[conditions][1--1][type] true base_subtotal = true rule[conditions][1--1][attribute] true >= = true rule[conditions][1--1][operator] true 100 = true rule[conditions][1--1][value] true = true rule[conditions][1][new_chlid] true Magento\SalesRule\Model\Rule\Condition\Product\Combine = true rule[actions][1][type] true all = true rule[actions][1][aggregator] true 1 = true rule[actions][1][value] true = true rule[actions][1][new_child] true = true store_labels[1] true = true store_labels[2] true = true related_banners true ${admin_form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales_rule/promo_quote/save/ POST true false true false false You saved the rule. Assertion.response_data false 16 1 0 ${__javaScript(Math.round(${adminPromotionsManagementDelay}*1000))} 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${adminCustomerManagementPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Customer Management"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx mpaf/tool/fragments/ce/admin_customer_management/admin_customer_management.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/customer/index GET true false true false false Accept-Language en-US,en;q=0.5 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept-Encoding gzip, deflate true customer_listing = true namespace true = true search true true = true filters[placeholder] true 20 = true paging[pageSize] true 1 = true paging[current] true entity_id = true sorting[field] true asc = true sorting[direction] true true = true isAjax 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false X-Requested-With XMLHttpRequest true customer_listing = true namespace true Lastname = true search true true = true filters[placeholder] true 20 = true paging[pageSize] true 1 = true paging[current] true entity_id = true sorting[field] true asc = true sorting[direction] true true = true isAjax 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false X-Requested-With XMLHttpRequest false customer_edit_url_path actions":\{"edit":\{"href":"(?:http|https):\\/\\/(.*?)\\/customer\\/index\\/edit\\/id\\/(\d+)\\/", /customer/index/edit/id/$2$/ 1 ^.+$ Assertion.response_data false 1 variable customer_edit_url_path 60000 200000 ${request_protocol} ${base_path}${admin_path}${customer_edit_url_path} GET true false true false false Customer Information Assertion.response_data false 2 false admin_customer_entity_id "entity_id":"(\d+)" $1$ 1 false admin_customer_website_id "website_id":"(\d+)" $1$ 1 false admin_customer_firstname "firstname":"([^"]+)" $1$ 1 false admin_customer_lastname "lastname":"([^"]+)" $1$ 1 false admin_customer_email "email":"([^\@]+@[^.]+.[^"]+)" $1$ 1 false admin_customer_group_id "group_id":"(\d+)" $1$ 1 false admin_customer_store_id "store_id":"(\d+)" $1$ 1 false admin_customer_created_at "created_at":"([^"]+)" $1$ 1 false admin_customer_updated_at "updated_at":"([^"]+)" $1$ 1 false admin_customer_is_active "is_active":"(\d+)" $1$ 1 false admin_customer_disable_auto_group_change "disable_auto_group_change":"(\d+)" $1$ 1 false admin_customer_created_in "created_in":"([^"]+)" $1$ 1 false admin_customer_dob "dob":"(\d+)-(\d+)-(\d+)" $2$/$3$/$1$ 1 false admin_customer_default_billing "default_billing":"(\d+)" $1$ 1 false admin_customer_default_shipping "default_shipping":"(\d+)" $1$ 1 false admin_customer_gender "gender":"(\d+)" $1$ 1 false admin_customer_failures_num "failures_num":"(\d+)" $1$ 1 false admin_customer_address_entity_id _address":\{"entity_id":"(\d+)".+?"parent_id":"${admin_customer_entity_id}" $1$ 1 false admin_customer_address_created_at _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"created_at":"([^"]+)" $1$ 1 false admin_customer_address_updated_at _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"updated_at":"([^"]+)" $1$ 1 false admin_customer_address_is_active _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"is_active":"(\d+)" $1$ 1 false admin_customer_address_city _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"city":"([^"]+)" $1$ 1 false admin_customer_address_country_id _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"country_id":"([^"]+)" $1$ 1 false admin_customer_address_firstname _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"firstname":"([^"]+)" $1$ 1 false admin_customer_address_lastname _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"lastname":"([^"]+)" $1$ 1 false admin_customer_address_postcode _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"postcode":"([^"]+)" $1$ 1 false admin_customer_address_region _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region":"([^"]+)" $1$ 1 false admin_customer_address_region_id _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"region_id":"([^"]+)" $1$ 1 false admin_customer_address_street _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"street":\["([^"]+)"\] $1$ 1 false admin_customer_address_telephone _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"telephone":"([^"]+)" $1$ 1 false admin_customer_address_customer_id _address":\{.+?"parent_id":"${admin_customer_entity_id}".+?"customer_id":"([^"]+)" $1$ 1 ^\d+$ Assertion.response_data false 1 variable admin_customer_entity_id ^\d+$ Assertion.response_data false 1 variable admin_customer_website_id ^.+$ Assertion.response_data false 1 variable admin_customer_firstname ^.+$ Assertion.response_data false 1 variable admin_customer_lastname ^.+$ Assertion.response_data false 1 variable admin_customer_email ^\d+$ Assertion.response_data false 1 variable admin_customer_group_id ^\d+$ Assertion.response_data false 1 variable admin_customer_store_id ^.+$ Assertion.response_data false 1 variable admin_customer_created_at ^.+$ Assertion.response_data false 1 variable admin_customer_updated_at ^\d+$ Assertion.response_data false 1 variable admin_customer_is_active ^\d+$ Assertion.response_data false 1 variable admin_customer_disable_auto_group_change ^.+$ Assertion.response_data false 1 variable admin_customer_created_in ^\d+/\d+/\d+$ Assertion.response_data false 1 variable admin_customer_dob ^\d+$ Assertion.response_data false 1 variable admin_customer_default_billing ^\d+$ Assertion.response_data false 1 variable admin_customer_default_shipping ^\d+$ Assertion.response_data false 1 variable admin_customer_gender ^\d+$ Assertion.response_data false 1 variable admin_customer_failures_num ^\d+$ Assertion.response_data false 1 variable admin_customer_address_entity_id ^.+$ Assertion.response_data false 1 variable admin_customer_address_created_at ^.+$ Assertion.response_data false 1 variable admin_customer_address_updated_at ^\d+$ Assertion.response_data false 1 variable admin_customer_address_is_active ^.+$ Assertion.response_data false 1 variable admin_customer_address_city ^.+$ Assertion.response_data false 1 variable admin_customer_address_country_id ^.+$ Assertion.response_data false 1 variable admin_customer_address_firstname ^.+$ Assertion.response_data false 1 variable admin_customer_address_lastname ^.+$ Assertion.response_data false 1 variable admin_customer_address_postcode ^.+$ Assertion.response_data false 1 variable admin_customer_address_region ^\d+$ Assertion.response_data false 1 variable admin_customer_address_region_id ^.+$ Assertion.response_data false 1 variable admin_customer_address_street ^.+$ Assertion.response_data false 1 variable admin_customer_address_telephone ^\d+$ Assertion.response_data false 1 variable admin_customer_address_customer_id Accept-Language en-US,en;q=0.5 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept-Encoding gzip, deflate true true = true isAjax true ${admin_customer_entity_id} = true customer[entity_id] true ${admin_customer_website_id} = true customer[website_id] true ${admin_customer_email} = true customer[email] true ${admin_customer_group_id} = true customer[group_id] true ${admin_customer_store_id} = true customer[store_id] true ${admin_customer_created_at} = true customer[created_at] true ${admin_customer_updated_at} = true customer[updated_at] true ${admin_customer_is_active} = true customer[is_active] true ${admin_customer_disable_auto_group_change} = true customer[disable_auto_group_change] true ${admin_customer_created_in} = true customer[created_in] true = true customer[prefix] true ${admin_customer_firstname} 1 = true customer[firstname] true = true customer[middlename] true ${admin_customer_lastname} 1 = true customer[lastname] true = true customer[suffix] true ${admin_customer_dob} = true customer[dob] true ${admin_customer_default_billing} = true customer[default_billing] true ${admin_customer_default_shipping} = true customer[default_shipping] true = true customer[taxvat] true ${admin_customer_gender} = true customer[gender] true ${admin_customer_failures_num} = true customer[failures_num] true ${admin_customer_store_id} = true customer[sendemail_store_id] true ${admin_customer_address_entity_id} = true address[${admin_customer_address_entity_id}][entity_id] true ${admin_customer_address_created_at} = true address[${admin_customer_address_entity_id}][created_at] true ${admin_customer_address_updated_at} = true address[${admin_customer_address_entity_id}][updated_at] true ${admin_customer_address_is_active} = true address[${admin_customer_address_entity_id}][is_active] true ${admin_customer_address_city} = true address[${admin_customer_address_entity_id}][city] true = true address[${admin_customer_address_entity_id}][company] true ${admin_customer_address_country_id} = true address[${admin_customer_address_entity_id}][country_id] true ${admin_customer_address_firstname} = true address[${admin_customer_address_entity_id}][firstname] true ${admin_customer_address_lastname} = true address[${admin_customer_address_entity_id}][lastname] true = true address[${admin_customer_address_entity_id}][middlename] true ${admin_customer_address_postcode} = true address[${admin_customer_address_entity_id}][postcode] true = true address[${admin_customer_address_entity_id}][prefix] true ${admin_customer_address_region} = true address[${admin_customer_address_entity_id}][region] true ${admin_customer_address_region_id} = true address[${admin_customer_address_entity_id}][region_id] true ${admin_customer_address_street} = true address[${admin_customer_address_entity_id}][street][0] true = true address[${admin_customer_address_entity_id}][street][1] true = true address[${admin_customer_address_entity_id}][suffix] true ${admin_customer_address_telephone} = true address[${admin_customer_address_entity_id}][telephone] true = true address[${admin_customer_address_entity_id}][vat_id] true ${admin_customer_address_customer_id} = true address[${admin_customer_address_entity_id}][customer_id] true true = true address[${admin_customer_address_entity_id}][default_billing] true true = true address[${admin_customer_address_entity_id}][default_shipping] true = true address[new_0][prefix] true John = true address[new_0][firstname] true = true address[new_0][middlename] true Doe = true address[new_0][lastname] true = true address[new_0][suffix] true Test Company = true address[new_0][company] true Folsom = true address[new_0][city] true 95630 = true address[new_0][postcode] true 1234567890 = true address[new_0][telephone] true = true address[new_0][vat_id] true false = true address[new_0][default_billing] true false = true address[new_0][default_shipping] true 123 Main = true address[new_0][street][0] true = true address[new_0][street][1] true = true address[new_0][region] true US = true address[new_0][country_id] true ${admin_customer_address_region_id} = true address[new_0][region_id] true ${admin_form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}${admin_path}/customer/index/validate/ POST true false true false false 200 Assertion.response_code false 16 true true = true isAjax true ${admin_customer_entity_id} = true customer[entity_id] true ${admin_customer_website_id} = true customer[website_id] true ${admin_customer_email} = true customer[email] true ${admin_customer_group_id} = true customer[group_id] true ${admin_customer_store_id} = true customer[store_id] true ${admin_customer_created_at} = true customer[created_at] true ${admin_customer_updated_at} = true customer[updated_at] true ${admin_customer_is_active} = true customer[is_active] true ${admin_customer_disable_auto_group_change} = true customer[disable_auto_group_change] true ${admin_customer_created_in} = true customer[created_in] true = true customer[prefix] true ${admin_customer_firstname} 1 = true customer[firstname] true = true customer[middlename] true ${admin_customer_lastname} 1 = true customer[lastname] true = true customer[suffix] true ${admin_customer_dob} = true customer[dob] true ${admin_customer_default_billing} = true customer[default_billing] true ${admin_customer_default_shipping} = true customer[default_shipping] true = true customer[taxvat] true ${admin_customer_gender} = true customer[gender] true ${admin_customer_failures_num} = true customer[failures_num] true ${admin_customer_store_id} = true customer[sendemail_store_id] true ${admin_customer_address_entity_id} = true address[${admin_customer_address_entity_id}][entity_id] true ${admin_customer_address_created_at} = true address[${admin_customer_address_entity_id}][created_at] true ${admin_customer_address_updated_at} = true address[${admin_customer_address_entity_id}][updated_at] true ${admin_customer_address_is_active} = true address[${admin_customer_address_entity_id}][is_active] true ${admin_customer_address_city} = true address[${admin_customer_address_entity_id}][city] true = true address[${admin_customer_address_entity_id}][company] true ${admin_customer_address_country_id} = true address[${admin_customer_address_entity_id}][country_id] true ${admin_customer_address_firstname} = true address[${admin_customer_address_entity_id}][firstname] true ${admin_customer_address_lastname} = true address[${admin_customer_address_entity_id}][lastname] true = true address[${admin_customer_address_entity_id}][middlename] true ${admin_customer_address_postcode} = true address[${admin_customer_address_entity_id}][postcode] true = true address[${admin_customer_address_entity_id}][prefix] true ${admin_customer_address_region} = true address[${admin_customer_address_entity_id}][region] true ${admin_customer_address_region_id} = true address[${admin_customer_address_entity_id}][region_id] true ${admin_customer_address_street} = true address[${admin_customer_address_entity_id}][street][0] true = true address[${admin_customer_address_entity_id}][street][1] true = true address[${admin_customer_address_entity_id}][suffix] true ${admin_customer_address_telephone} = true address[${admin_customer_address_entity_id}][telephone] true = true address[${admin_customer_address_entity_id}][vat_id] true ${admin_customer_address_customer_id} = true address[${admin_customer_address_entity_id}][customer_id] true true = true address[${admin_customer_address_entity_id}][default_billing] true true = true address[${admin_customer_address_entity_id}][default_shipping] true = true address[new_0][prefix] true John = true address[new_0][firstname] true = true address[new_0][middlename] true Doe = true address[new_0][lastname] true = true address[new_0][suffix] true Test Company = true address[new_0][company] true Folsom = true address[new_0][city] true 95630 = true address[new_0][postcode] true 1234567890 = true address[new_0][telephone] true = true address[new_0][vat_id] true false = true address[new_0][default_billing] true false = true address[new_0][default_shipping] true 123 Main = true address[new_0][street][0] true = true address[new_0][street][1] true = true address[new_0][region] true US = true address[new_0][country_id] true 12 = true address[new_0][region_id] true ${admin_form_key} = true form_key 60000 200000 ${request_protocol} ${base_path}${admin_path}/customer/index/save/ POST true false true true false You saved the customer. Assertion.response_data false 2 1 0 ${__javaScript(Math.round(${adminCustomerManagementDelay}*1000))} 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${adminEditOrderPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Admin Edit Order"); true function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/orders_page.jmx Create New Order Assertion.response_data false 2 true sales_order_grid = true namespace true = true search true true = true filters[placeholder] true 200 = true paging[pageSize] true 1 = true paging[current] true increment_id = true sorting[field] true desc = true sorting[direction] true true = true isAjax true ${admin_form_key} = true form_key false true pending = true filters[status] true true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/open_orders.jmx totalRecords Assertion.response_data false 2 true ${admin_form_key} = true form_key true sales_order_grid = true namespace true true = true search true true true = true filters[placeholder] true true 200 = true paging[pageSize] true true 1 = true paging[current] true true increment_id = true sorting[field] true true asc = true sorting[direction] true true true = true isAjax true true pending = true filters[status] true ${__time()}${__Random(1,1000000)} = true _ 60000 200000 ${request_protocol} ${base_path}${admin_path}/mui/index/render/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/search_orders.jmx totalRecords Assertion.response_data false 2 false order_numbers \"increment_id\":\"(\d+)\"\, $1$ -1 simple_products false order_ids \"entity_id\":\"(\d+)\"\, $1$ -1 simple_products mpaf/tool/fragments/ce/admin_create_process_returns/setup.jmx import java.util.ArrayList; import java.util.HashMap; import org.apache.jmeter.protocol.http.util.Base64Encoder; import java.util.Random; // get count of "order_numbers" variable defined in "Search Pending Orders Limit" int ordersCount = Integer.parseInt(vars.get("order_numbers_matchNr")); int clusterLength; int threadsNumber = ctx.getThreadGroup().getNumThreads(); if (threadsNumber == 0) { //Number of orders for one thread clusterLength = ordersCount; } else { clusterLength = Math.round(ordersCount / threadsNumber); if (clusterLength == 0) { clusterLength = 1; } } //Current thread number starts from 0 int currentThreadNum = ctx.getThreadNum(); //Index of the current product from the cluster Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom} + ${__threadNum}); } int iterator = random.nextInt(clusterLength); if (iterator == 0) { iterator = 1; } int i = clusterLength * currentThreadNum + iterator; orderNumber = vars.get("order_numbers_" + i.toString()); orderId = vars.get("order_ids_" + i.toString()); vars.put("order_number", orderNumber); vars.put("order_id", orderId); false 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order/view/order_id/${order_id}/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/open_order.jmx #${order_number} Assertion.response_data false 2 false order_status <span id="order_status">([^<]+)</span> $1$ 1 simple_products "${order_status}" == "Pending" false mpaf/tool/fragments/ce/admin_edit_order/if_controller.jmx true pending = true history[status] false true Some text = true history[comment] true ${admin_form_key} = true form_key false 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order/addComment/order_id/${order_id}/?isAjax=true POST true false true false false mpaf/tool/fragments/ce/admin_edit_order/add_comment.jmx Not Notified Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_invoice/start/order_id/${order_id}/ GET true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/invoice_start.jmx Invoice Totals Assertion.response_data false 2 false item_ids <div id="order_item_(\d+)_title"\s*class="product-title"> $1$ -1 simple_products true ${admin_form_key} = true form_key false true 1 = true invoice[items][${item_ids_1}] true 1 = true invoice[items][${item_ids_2}] true Invoiced = true invoice[comment_text] 60000 200000 ${request_protocol} ${base_path}${admin_path}/sales/order_invoice/save/order_id/${order_id}/ POST true false true false false mpaf/tool/fragments/ce/admin_create_process_returns/invoice_submit.jmx The invoice has been created Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/order_shipment/start/order_id/${order_id}/ GET true false true false false mpaf/tool/fragments/ce/admin_edit_order/shipment_start.jmx New Shipment Assertion.response_data false 2 true ${admin_form_key} = true form_key false true 1 = true shipment[items][${item_ids_1}] true 1 = true shipment[items][${item_ids_2}] true Shipped = true shipment[comment_text] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/order_shipment/save/order_id/${order_id}/ POST true false true false false mpaf/tool/fragments/ce/admin_edit_order/shipment_submit.jmx The shipment has been created Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx 1 false 1 ${catalogGraphQLPercentage} mpaf/tool/fragments/_system/scenario_controller_tmpl.jmx var testLabel = "${testLabel}" ? " (${testLabel})" : ""; if (testLabel && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' ) { if (sampler.getName().indexOf(testLabel) == -1) { sampler.setName(sampler.getName() + testLabel); } } else if (sampler.getName().indexOf("SetUp - ") == -1) { sampler.setName("SetUp - " + sampler.getName()); } javascript mpaf/tool/fragments/_system/setup_label.jmx vars.put("testLabel", "Catalog GraphQL"); true mpaf/tool/fragments/ce/once_only_controller.jmx function getFormKeyFromResponse() { var url = prev.getUrlAsString(), responseCode = prev.getResponseCode(), formKey = null; searchPattern = /var FORM_KEY = '(.+)'/; if (responseCode == "200" && url) { response = prev.getResponseDataAsString(); formKey = response && response.match(searchPattern) ? response.match(searchPattern)[1] : null; } return formKey; } formKey = vars.get("form_key_storage"); currentFormKey = getFormKeyFromResponse(); if (currentFormKey != null && currentFormKey != formKey) { vars.put("form_key_storage", currentFormKey); } javascript mpaf/tool/fragments/ce/admin/handle_admin_form_key.jmx formKey = vars.get("form_key_storage"); if (formKey && sampler.getClass().getName() == 'org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy' && sampler.getMethod() == "POST") { arguments = sampler.getArguments(); for (i=0; i<arguments.getArgumentCount(); i++) { argument = arguments.getArgument(i); if (argument.getName() == 'form_key' && argument.getValue() != formKey) { log.info("admin form key updated: " + argument.getValue() + " => " + formKey); argument.setValue(formKey); } } } javascript false mpaf/tool/fragments/ce/http_cookie_manager_without_clear_each_iteration.jmx mpaf/tool/fragments/ce/simple_controller.jmx get-admin-email mpaf/tool/fragments/ce/lock_controller.jmx mpaf/tool/fragments/ce/get_admin_email.jmx adminUserList = props.get("adminUserList"); adminUserListIterator = props.get("adminUserListIterator"); adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUser = adminUserList.poll(); } else { if (!adminUserListIterator.hasNext()) { adminUserListIterator = adminUserList.descendingIterator(); } adminUser = adminUserListIterator.next(); } if (adminUser == null) { SampleResult.setResponseMessage("adminUser list is empty"); SampleResult.setResponseData("adminUser list is empty","UTF-8"); IsSuccess=false; SampleResult.setSuccessful(false); SampleResult.setStopThread(true); } vars.put("admin_user", adminUser); true 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/ GET true false true false false mpaf/tool/fragments/ce/admin_login/admin_login.jmx Welcome <title>Magento Admin</title> Assertion.response_data false 2 false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 ^.+$ Assertion.response_data false 1 variable admin_form_key true = true dummy true ${admin_form_key} = true form_key true ${admin_password} = true login[password] true ${admin_user} = true login[username] 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/dashboard/ POST true false true false Java false mpaf/tool/fragments/ce/admin_login/admin_login_submit_form.jmx false admin_form_key <input name="form_key" type="hidden" value="([^'"]+)" /> $1$ 1 mpaf/tool/fragments/ce/admin_login/admin_retrieve_form_key.jmx mpaf/tool/fragments/ce/simple_controller.jmx mpaf/tool/fragments/ce/admin_indexers_management/admin_indexer_management_catalog_set_on_save.jmx ${request_protocol} ${base_path}${admin_path}/indexer/indexer/list/ GET true false true false false Accept-Language en-US,en;q=0.5 Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0 Accept-Encoding gzip, deflate true catalog_category_product,catalog_product_category,catalog_product_price,catalog_product_attribute,cataloginventory_stock,catalogsearch_fulltext = true indexer_ids true ${admin_form_key} = true form_key false indexer_ids = true massaction_prepare_key ${request_protocol} ${base_path}${admin_path}/indexer/indexer/massOnTheFly/ POST true false true false false 200 Assertion.response_code false 16 mpaf/tool/fragments/ce/admin_create_product/get_related_product_id.jmx import org.apache.jmeter.samplers.SampleResult; import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom}); } relatedIndex = random.nextInt(props.get("simple_products_list").size()); vars.put("related_product_id", props.get("simple_products_list").get(relatedIndex).get("id")); true mpaf/tool/fragments/ce/simple_controller.jmx Content-Type application/json Accept */* mpaf/tool/fragments/ce/api/header_manager_before_token.jmx true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false mpaf/tool/fragments/ce/api/admin_token_retrieval.jmx admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} mpaf/tool/fragments/ce/api/header_manager.jmx false mycolor = true searchCriteria[filterGroups][0][filters][0][value] false attribute_code = true searchCriteria[filterGroups][0][filters][0][field] false mysize = true searchCriteria[filterGroups][0][filters][1][value] false attribute_code = true searchCriteria[filterGroups][0][filters][1][field] 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products/attributes GET true false true false false mpaf/tool/fragments/ce/admin_create_product/get_product_attributes.jmx product_attributes $.items BODY javascript var attributesData = JSON.parse(vars.get("product_attributes")), maxOptions = 2; attributes = []; for (i in attributesData) { if (i >= 2) { break; } var data = attributesData[i], attribute = { "id": data.attribute_id, "code": data.attribute_code, "label": data.default_frontend_label, "options": [] }; var processedOptions = 0; for (optionN in data.options) { var option = data.options[optionN]; if (parseInt(option.value) > 0 && processedOptions < maxOptions) { processedOptions++; attribute.options.push(option); } } attributes.push(attribute); } vars.putObject("product_attributes", attributes); 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product_set/index/filter/${attribute_set_filter} GET true false true false false mpaf/tool/fragments/ce/admin_create_product/configurable_setup_attribute_set.jmx false attribute_set_id catalog\/product_set\/edit\/id\/([\d]+)\/"[\D\d]*Attribute Set 1 $1$ 1 false import org.apache.commons.codec.binary.Base64; byte[] encodedBytes = Base64.encodeBase64("set_name=Attribute Set 1".getBytes()); vars.put("attribute_set_filter", new String(encodedBytes)); import org.apache.jmeter.samplers.SampleResult; import java.util.Random; Random random = new Random(); if (${seedForRandom} > 0) { random.setSeed(${seedForRandom}); } number = random.nextInt(props.get("simple_products_list_for_edit").size()); simpleList = props.get("simple_products_list_for_edit").get(number); vars.put("simple_product_1_id", simpleList.get("id")); vars.put("simple_product_1_name", simpleList.get("title")); do { number1 = random.nextInt(props.get("simple_products_list_for_edit").size()); } while(number == number1); simpleList = props.get("simple_products_list_for_edit").get(number1); vars.put("simple_product_2_id", simpleList.get("id")); vars.put("simple_product_2_name", simpleList.get("title")); number2 = random.nextInt(props.get("configurable_products_list").size()); configurableList = props.get("configurable_products_list").get(number2); vars.put("configurable_product_1_id", configurableList.get("id")); vars.put("configurable_product_1_url_key", configurableList.get("url_key")); vars.put("configurable_product_1_name", configurableList.get("title")); //Additional category to be added //int categoryId = Integer.parseInt(vars.get("simple_product_category_id")); //vars.put("category_additional", (categoryId+1).toString()); //New price vars.put("price_new", "9999"); //New special price vars.put("special_price_new", "8888"); //New quantity vars.put("quantity_new", "100600"); vars.put("configurable_sku", "Configurable Product - ${__time(YMD)}-${__threadNum}-${__Random(1,1000000)}"); true mpaf/tool/fragments/ce/admin_create_product/setup.jmx mpaf/tool/fragments/ce/admin_create_product/create_bundle_product.jmx 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/ GET true false true false false records found Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/new/set/4/type/bundle/ GET true false true false false New Product Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 42 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 1 = true product[product_has_weight] true true 2 = true product[category_ids][] true <p>Full bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] true 1 = true product[status] true = true product[configurable_variations] true 1 = true affect_configurable_product_attributes true = true product[image] true = true product[small_image] true = true product[thumbnail] true bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true 1 = true product[stock_data][notify_stock_qty] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true = true new-variations-attribute-set-id true 0 = true product[shipment_type] true option title one = true bundle_options[bundle_options][0][title] true = true bundle_options[bundle_options][0][option_id] true = true bundle_options[bundle_options][0][delete] true select = true bundle_options[bundle_options][0][type] true 1 = true bundle_options[bundle_options][0][required] true 0 = true bundle_options[bundle_options][0][position] true = true bundle_options[bundle_options][0][bundle_selections][0][selection_id] true = true bundle_options[bundle_options][0][bundle_selections][0][option_id] true ${simple_product_1_id} = true bundle_options[bundle_options][0][bundle_selections][0][product_id] true = true bundle_options[bundle_options][0][bundle_selections][0][delete] true 25 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_qty] true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] true 0 = true bundle_options[bundle_options][0][bundle_selections][0][position] true = true bundle_options[bundle_options][0][bundle_selections][1][selection_id] true = true bundle_options[bundle_options][0][bundle_selections][1][option_id] true ${simple_product_2_id} = true bundle_options[bundle_options][0][bundle_selections][1][product_id] true = true bundle_options[bundle_options][0][bundle_selections][1][delete] true 10.99 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] true 0 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_qty] true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] true 1 = true bundle_options[bundle_options][0][bundle_selections][1][position] true option title two = true bundle_options[bundle_options][1][title] true = true bundle_options[bundle_options][1][option_id] true = true bundle_options[bundle_options][1][delete] true select = true bundle_options[bundle_options][1][type] true 1 = true bundle_options[bundle_options][1][required] true 1 = true bundle_options[bundle_options][1][position] true = true bundle_options[bundle_options][1][bundle_selections][0][selection_id] true true = true bundle_options[bundle_options][1][bundle_selections][0][option_id] true true ${simple_product_1_id} = true bundle_options[bundle_options][1][bundle_selections][0][product_id] true true = true bundle_options[bundle_options][1][bundle_selections][0][delete] true true 5.00 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] true true 0 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] true true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_qty] true true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] true true 0 = true bundle_options[bundle_options][1][bundle_selections][0][position] true true = true bundle_options[bundle_options][1][bundle_selections][1][selection_id] true true = true bundle_options[bundle_options][1][bundle_selections][1][option_id] true true ${simple_product_2_id} = true bundle_options[bundle_options][1][bundle_selections][1][product_id] true true = true bundle_options[bundle_options][1][bundle_selections][1][delete] true true 7.00 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] true true 0 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] true true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_qty] true true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] true true 1 = true bundle_options[bundle_options][1][bundle_selections][1][position] true true 2 = true affect_bundle_product_selections true true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/validate/set/4/ POST true false true false false {"error":false} Assertion.response_data false 2 true true = true ajax false true true = true isAjax false true ${admin_form_key} = true form_key false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[name] false true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[sku] false true 42 = true product[price] true 2 = true product[tax_class_id] true 111 = true product[quantity_and_stock_status][qty] true 1 = true product[quantity_and_stock_status][is_in_stock] true 1.0000 = true product[weight] true 1 = true product[product_has_weight] true true 2 = true product[category_ids][] true <p>Full bundle product Description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[description] true <p>Short bundle product description ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}</p> = true product[short_description] true 1 = true product[status] true = true product[configurable_variations] true 1 = true affect_configurable_product_attributes true = true product[image] true = true product[small_image] true = true product[thumbnail] true bundle-product-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} = true product[url_key] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Title = true product[meta_title] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Keyword = true product[meta_keyword] true Bundle Product ${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)} Meta Description = true product[meta_description] true 1 = true product[website_ids][] true 99 = true product[special_price] true = true product[special_from_date] true = true product[special_to_date] true = true product[cost] true 0 = true product[tier_price][0][website_id] true 32000 = true product[tier_price][0][cust_group] true 100 = true product[tier_price][0][price_qty] true 90 = true product[tier_price][0][price] true = true product[tier_price][0][delete] true 0 = true product[tier_price][1][website_id] true 1 = true product[tier_price][1][cust_group] true 101 = true product[tier_price][1][price_qty] true 99 = true product[tier_price][1][price] true = true product[tier_price][1][delete] true 1 = true product[stock_data][use_config_manage_stock] true 100500 = true product[stock_data][original_inventory_qty] true 100500 = true product[stock_data][qty] true 0 = true product[stock_data][min_qty] true 1 = true product[stock_data][use_config_min_qty] true 1 = true product[stock_data][min_sale_qty] true 1 = true product[stock_data][use_config_min_sale_qty] true 10000 = true product[stock_data][max_sale_qty] true 1 = true product[stock_data][use_config_max_sale_qty] true 0 = true product[stock_data][is_qty_decimal] true 0 = true product[stock_data][is_decimal_divided] true 0 = true product[stock_data][backorders] true 1 = true product[stock_data][use_config_backorders] true 1 = true product[stock_data][notify_stock_qty] true 1 = true product[stock_data][use_config_notify_stock_qty] true 0 = true product[stock_data][enable_qty_increments] true 0 = true product[stock_data][qty_increments] true 1 = true product[stock_data][use_config_qty_increments] true 1 = true product[stock_data][is_in_stock] true = true product[custom_design] true = true product[custom_design_from] true = true product[custom_design_to] true = true product[custom_layout_update] true = true product[page_layout] true container2 = true product[options_container] true = true new-variations-attribute-set-id true 0 = true product[shipment_type] false true option title one = true bundle_options[bundle_options][0][title] false true = true bundle_options[bundle_options][0][option_id] false true = true bundle_options[bundle_options][0][delete] false true select = true bundle_options[bundle_options][0][type] false true 1 = true bundle_options[bundle_options][0][required] false true 0 = true bundle_options[bundle_options][0][position] false true = true bundle_options[bundle_options][0][bundle_selections][0][selection_id] false true = true bundle_options[bundle_options][0][bundle_selections][0][option_id] false true ${simple_product_1_id} = true bundle_options[bundle_options][0][bundle_selections][0][product_id] false true = true bundle_options[bundle_options][0][bundle_selections][0][delete] false true 25 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_value] false true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_price_type] false true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_qty] false true 1 = true bundle_options[bundle_options][0][bundle_selections][0][selection_can_change_qty] false true 0 = true bundle_options[bundle_options][0][bundle_selections][0][position] false true = true bundle_options[bundle_options][0][bundle_selections][1][selection_id] false true = true bundle_options[bundle_options][0][bundle_selections][1][option_id] false true ${simple_product_2_id} = true bundle_options[bundle_options][0][bundle_selections][1][product_id] false true = true bundle_options[bundle_options][0][bundle_selections][1][delete] false true 10.99 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_value] false true 0 = true bundle_options[bundle_options][0][bundle_selections][1][selection_price_type] false true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_qty] false true 1 = true bundle_options[bundle_options][0][bundle_selections][1][selection_can_change_qty] false true 1 = true bundle_options[bundle_options][0][bundle_selections][1][position] false true option title two = true bundle_options[bundle_options][1][title] false true = true bundle_options[bundle_options][1][option_id] false true = true bundle_options[bundle_options][1][delete] false true select = true bundle_options[bundle_options][1][type] false true 1 = true bundle_options[bundle_options][1][required] false true 1 = true bundle_options[bundle_options][1][position] false true = true bundle_options[bundle_options][1][bundle_selections][0][selection_id] false true = true bundle_options[bundle_options][1][bundle_selections][0][option_id] false true ${simple_product_1_id} = true bundle_options[bundle_options][1][bundle_selections][0][product_id] false true = true bundle_options[bundle_options][1][bundle_selections][0][delete] false true 5.00 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_value] false true 0 = true bundle_options[bundle_options][1][bundle_selections][0][selection_price_type] false true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_qty] false true 1 = true bundle_options[bundle_options][1][bundle_selections][0][selection_can_change_qty] false true 0 = true bundle_options[bundle_options][1][bundle_selections][0][position] false true = true bundle_options[bundle_options][1][bundle_selections][1][selection_id] false true = true bundle_options[bundle_options][1][bundle_selections][1][option_id] false true ${simple_product_2_id} = true bundle_options[bundle_options][1][bundle_selections][1][product_id] false true = true bundle_options[bundle_options][1][bundle_selections][1][delete] false true 7.00 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_value] false true 0 = true bundle_options[bundle_options][1][bundle_selections][1][selection_price_type] false true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_qty] false true 1 = true bundle_options[bundle_options][1][bundle_selections][1][selection_can_change_qty] false true 1 = true bundle_options[bundle_options][1][bundle_selections][1][position] false true 2 = true affect_bundle_product_selections false true ${related_product_id} = true links[related][0][id] true 1 = true links[related][0][position] true ${related_product_id} = true links[upsell][0][id] true 1 = true links[upsell][0][position] true ${related_product_id} = true links[crosssell][0][id] true 1 = true links[crosssell][0][position] 60000 200000 ${request_protocol} ${base_path}${admin_path}/catalog/product/save/set/4/type/bundle/back/edit/active_tab/product-details/ POST true false true false false You saved the product option title one option title two ${simple_product_2_name} ${simple_product_1_name} Assertion.response_data false 2 60000 200000 ${request_protocol} ${base_path}${admin_path}/admin/auth/logout/ GET true false true false false mpaf/tool/fragments/ce/setup/admin_logout.jmx false adminUsersDistribution = Integer.parseInt(vars.get("admin_users_distribution_per_admin_pool")); if (adminUsersDistribution == 1) { adminUserList = props.get("adminUserList"); adminUserList.add(vars.get("admin_user")); } mpaf/tool/fragments/ce/common/return_admin_email_to_pool.jmx mpaf/tool/fragments/ce/simple_controller.jmx Content-Type application/json Accept */* mpaf/tool/fragments/ce/api/header_manager_before_token.jmx true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false mpaf/tool/fragments/ce/api/admin_token_retrieval.jmx admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} mpaf/tool/fragments/ce/api/header_manager.jmx true false { "product": { "sku": "apsku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", "name": "Extensible_Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", "visibility": "4", "type_id": "simple", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time()}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":0, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = 60000 200000 ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false mpaf/tool/fragments/ce/api/create_product_with_extensible_data_objects.jmx simple_product_id $.id BODY simple_product_sku $.sku BODY simple_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable simple_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable simple_product_sku ^\d+$ Assertion.response_data false 1 variable simple_stock_item_id mpaf/tool/fragments/ce/api/create_configurable_product_with_extensible_data_objects.jmx configurable_product_attribute_color_1 color123X = configurable_product_attribute_color_2 color567Y = color_attribute_section 0 = "${color_attribute_section}" == "0" false true false { "attributeSetId": 4, "attributeGroupId": 7, "attributeCode": "color", "sortOrder": 0 } = ${request_protocol} ${base_path}rest/default/V1/products/attribute-sets/attributes POST true false true false false ^\"\d+\"$ Assertion.response_data false 1 color_attribute_section $ BODY ${request_protocol} ${base_path}rest/default/V1/products/attributes/color/options GET true false true false false color_1_value_id $.[?(@.label =~ /${configurable_product_attribute_color_1}/i)].value null color_2_value_id $.[?(@.label =~ /${configurable_product_attribute_color_2}/i)].value null "${color_1_value_id}" == "null" false true false { "option": { "label": "${configurable_product_attribute_color_1}" } } = ${request_protocol} ${base_path}rest/default/V1/products/attributes/color/options POST true false true false false ^[a-z0-9_\"]+$ Assertion.response_data false 1 ${request_protocol} ${base_path}rest/default/V1/products/attributes/color/options GET true false true false false color_1_value_id $.[?(@.label =~ /${configurable_product_attribute_color_1}/i)].value "${color_2_value_id}" == "null" false true false { "option": { "label": "${configurable_product_attribute_color_2}" } } = ${request_protocol} ${base_path}rest/default/V1/products/attributes/color/options POST true false true false false ^[a-z0-9_\"]+$ Assertion.response_data false 1 ${request_protocol} ${base_path}rest/default/V1/products/attributes/color/options GET true false true false false color_2_value_id $.[?(@.label =~ /${configurable_product_attribute_color_2}/i)].value true false { "product": { "sku": "configurable-apsku-test-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "name": "Configurable Extensible_Product_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "visibility": "4", "type_id": "configurable", "price": "99", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"configurable_test_label_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "configurable_test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false configurable_product_id $.id BODY configurable_product_sku $.sku BODY configurable_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable configurable_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable configurable_product_sku ^\d+$ Assertion.response_data false 1 variable configurable_stock_item_id true false { "product": { "sku": "apsku-test-${configurable_product_attribute_color_1}", "name": "Extensible_Product_${configurable_product_attribute_color_1}", "visibility": "1", "type_id": "simple", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" }, { "attribute_code": "color", "value": "${color_1_value_id}" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false configurable_red_product_id $.id BODY configurable_red_product_sku $.sku BODY configurable_red_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable configurable_red_product_id ^[A-Za-z0-9-]+$ Assertion.response_data false 1 variable configurable_red_product_sku ^\d+$ Assertion.response_data false 1 variable configurable_red_stock_item_id true false { "product": { "sku": "apsku-test-${configurable_product_attribute_color_2}", "name": "Extensible_Product_${configurable_product_attribute_color_2}", "visibility": "1", "type_id": "simple", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" }, { "attribute_code": "color", "value": "${color_2_value_id}" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false configurable_blue_product_id $.id BODY configurable_blue_product_sku $.sku BODY configurable_blue_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable configurable_blue_product_id ^[A-Za-z0-9-]+$ Assertion.response_data false 1 variable configurable_blue_product_sku ^\d+$ Assertion.response_data false 1 variable configurable_blue_stock_item_id true false { "option": { "attribute_id": "93", "label": "Color", "position": 0, "is_use_default": 1, "values": [ { "value_index": 0 } ] } } = ${request_protocol} ${base_path}rest/default/V1/configurable-products/${configurable_product_sku}/options POST true false true false false ^\"\d+\"$ Assertion.response_data false 1 true false {"childSku": "apsku-test-${configurable_product_attribute_color_1}"} = ${request_protocol} ${base_path}rest/default/V1/configurable-products/${configurable_product_sku}/child POST true false true false false true Assertion.response_data false 1 true false {"childSku": "apsku-test-${configurable_product_attribute_color_2}"} = ${request_protocol} ${base_path}rest/default/V1/configurable-products/${configurable_product_sku}/child POST true false true false false true Assertion.response_data false 1 mpaf/tool/fragments/ce/api/create_bundle_product_with_extensible_data_objects.jmx true false { "product": { "sku": "bundle-apsku-test-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "name": "Bundle Extensible_Product_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "visibility": "4", "type_id": "bundle", "price": "99", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "price_view", "value": "0" }, { "attribute_code": "price_type", "value": "0" }, { "attribute_code": "weight_type", "value": "0" }, { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"bundle_test_label_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "bundle_test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false bundle_product_id $.id BODY bundle_product_sku $.sku BODY ^\d+$ Assertion.response_data false 1 variable bundle_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable bundle_product_sku true false { "product": { "sku": "apsku-test-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "name": "Extensible_Product_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "visibility": "1", "type_id": "simple", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false bundle_child_1_product_id $.id BODY bundle_child_1_product_sku $.sku BODY bundle_child_1_product_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable bundle_child_1_product_id ^[A-Za-z0-9-]+$ Assertion.response_data false 1 variable bundle_child_1_product_sku ^\d+$ Assertion.response_data false 1 variable bundle_child_1_product_stock_item_id true false { "product": { "sku": "apsku-test-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "name": "Extensible_Product_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "visibility": "1", "type_id": "simple", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false bundle_child_2_product_id $.id BODY bundle_child_2_product_sku $.sku BODY bundle_child_2_product_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable bundle_child_2_product_id ^[A-Za-z0-9-]+$ Assertion.response_data false 1 variable bundle_child_2_product_sku ^\d+$ Assertion.response_data false 1 variable bundle_child_2_product_stock_item_id true false { "option": { "title": "option-${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}", "required": 1, "type": "select", "position": 0, "sku": "${bundle_product_sku}", "product_links": [ { "sku": "${bundle_child_1_product_sku}", "qty": 1, "position": 0, "is_default": 1, "can_change_quantity": 0 }, { "sku": "${bundle_child_2_product_sku}", "qty": 1, "position": 0, "is_default": 0, "can_change_quantity": 0 } ] } } = ${request_protocol} ${base_path}rest/default/V1/bundle-products/options/add POST true false true false false ^\"\d+\"$ Assertion.response_data false 1 mpaf/tool/fragments/ce/api/create_downloadable_product_with_extensible_data_objects.jmx true false { "product": { "sku": "apsku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", "name": "Extensible_Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", "visibility": "4", "type_id": "downloadable", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time()}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false downloadable_product_id $.id BODY downloadable_product_sku $.sku BODY ^\d+$ Assertion.response_data false 1 variable downloadable_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable downloadable_product_sku true false { "link": { "title": "link1", "sort_order": 0, "is_shareable": 1, "price": 10, "number_of_downloads": 10, "link_type": "file", "link_file_content": { "file_data": "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", "name": "file1.jpeg", "extension_attributes": {} }, "sample_type": "file", "sample_file_content": { "file_data": "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", "name": "file1.jpeg", "extension_attributes": {} }, "extension_attributes": {} }, "isGlobalScopeContent": 1 } = ${request_protocol} ${base_path}rest/default/V1/products/${downloadable_product_sku}/downloadable-links POST true false true false false downloadable_link_id $ BODY ^\d+$ Assertion.response_data false 1 downloadable_link_id variable true false { "link": { "title": "link2", "sort_order": 0, "is_shareable": 1, "price": 10, "number_of_downloads": 10, "link_type": "file", "link_file_content": { "file_data": "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", "name": "file1.jpeg", "extension_attributes": {} }, "sample_type": "file", "sample_file_content": { "file_data": "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", "name": "file1.jpeg", "extension_attributes": {} }, "extension_attributes": {} }, "isGlobalScopeContent": 1 } = ${request_protocol} ${base_path}rest/default/V1/products/${downloadable_product_sku}/downloadable-links POST true false true false false downloadable_link_id $ BODY ^\d+$ Assertion.response_data false 1 downloadable_link_id variable true false { "link": { "title": "link3", "sort_order": 0, "is_shareable": 1, "price": 10, "number_of_downloads": 10, "link_type": "file", "link_file_content": { "file_data": "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", "name": "file1.jpeg", "extension_attributes": {} }, "sample_type": "file", "sample_file_content": { "file_data": "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", "name": "file1.jpeg", "extension_attributes": {} }, "extension_attributes": {} }, "isGlobalScopeContent": 1 } = ${request_protocol} ${base_path}rest/default/V1/products/${downloadable_product_sku}/downloadable-links POST true false true false false downloadable_link_id $ BODY ^\d+$ Assertion.response_data false 1 downloadable_link_id variable true false { "sample": { "title": "sample1", "sort_order": 0, "sample_type": "file", "sample_file_content": { "file_data": "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", "name": "file2.jpeg", "extension_attributes": {} }, "sample_url": "string", "extension_attributes": {} }, "isGlobalScopeContent": 1 } = ${request_protocol} ${base_path}rest/default/V1/products/${downloadable_product_sku}/downloadable-links/samples POST true false true false false sample_link_id $ BODY ^\d+$ Assertion.response_data false 1 variable sample_link_id true false { "sample": { "title": "sample2", "sort_order": 0, "sample_type": "file", "sample_file_content": { "file_data": "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", "name": "file2.jpeg", "extension_attributes": {} }, "sample_url": "string", "extension_attributes": {} }, "isGlobalScopeContent": 1 } = ${request_protocol} ${base_path}rest/default/V1/products/${downloadable_product_sku}/downloadable-links/samples POST true false true false false sample_link_id $ BODY ^\d+$ Assertion.response_data false 1 variable sample_link_id true false { "product": { "sku": "apsku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", "name": "Extensible_Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", "visibility": "4", "type_id": "virtual", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time()}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":0, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false mpaf/tool/fragments/ce/api/create_virtual_product_with_extensible_data_objects.jmx virtual_product_id $.id BODY virtual_product_sku $.sku BODY virtual_stock_item_id $.extension_attributes.stock_item.item_id BODY ^\d+$ Assertion.response_data false 1 variable virtual_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable virtual_product_sku ^\d+$ Assertion.response_data false 1 variable virtual_stock_item_id mpaf/tool/fragments/ce/api/create_grouped_product_with_extensible_data_objects.jmx true false { "product": { "sku": "apsku-test-${__time()}-${__threadNum}-${__Random(1,1000000)}", "name": "Extensible_Product_${__time()}-${__threadNum}-${__Random(1,1000000)}", "visibility": "4", "type_id": "grouped", "price": "3.62", "status": "1", "attribute_set_id": "4", "custom_attributes": [ { "attribute_code": "cost", "value": "" }, { "attribute_code": "description", "value": "Description" } ], "extension_attributes":{ "stock_item":{ "manage_stock": 1, "is_in_stock": 1, "qty":"100" } } , "media_gallery_entries": [{ "id": null, "label":"test_label_${__time()}-${__threadNum}-${__Random(1,1000000)}", "position":1, "disabled":false, "media_type":"image", "types":["image"], "content":{ "base64_encoded_data": "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", "type": "image/jpeg", "name": "test_image_${__time(YMDHMS)}-${__threadNum}-${__Random(1,1000000)}.jpeg" } } ] } } = ${request_protocol} ${base_path}rest/default/V1/products POST true false true false false grouped_product_id $.id BODY grouped_product_sku $.sku BODY ^\d+$ Assertion.response_data false 1 variable grouped_product_id ^[a-z0-9-]+$ Assertion.response_data false 1 variable grouped_product_sku true false { "items": [ { "sku": "${grouped_product_sku}", "link_type": "associated", "linked_product_sku": "${bundle_product_sku}", "linked_product_type": "bundle", "position": 1, "extension_attributes": { "qty": 1 } }, { "sku": "${grouped_product_sku}", "link_type": "associated", "linked_product_sku": "${configurable_product_sku}", "linked_product_type": "configurable", "position": 2, "extension_attributes": { "qty": 1 } }, { "sku": "${grouped_product_sku}", "link_type": "associated", "linked_product_sku": "${simple_product_sku}", "linked_product_type": "simple", "position": 3, "extension_attributes": { "qty": 1 } }, { "sku": "${grouped_product_sku}", "link_type": "associated", "linked_product_sku": "${downloadable_product_sku}", "linked_product_type": "downloadable", "position": 4, "extension_attributes": { "qty": 1 } } ] } = ${request_protocol} ${base_path}rest/default/V1/products/${grouped_product_sku}/links POST true false true false false grouped_product_response $ BODY true Assertion.response_data false 8 variable grouped_product_response mpaf/tool/fragments/ce/simple_controller.jmx Content-Type application/json Accept */* mpaf/tool/fragments/ce/api/header_manager_before_token.jmx true false {"username":"${admin_user}","password":"${admin_password}"} = 60000 200000 ${request_protocol} ${base_path}rest/V1/integration/admin/token POST true false true false false mpaf/tool/fragments/ce/api/admin_token_retrieval.jmx admin_token $ BODY ^[a-z0-9-]+$ Assertion.response_data false 1 variable admin_token Authorization Bearer ${admin_token} mpaf/tool/fragments/ce/api/header_manager.jmx true false {"query":"{\n products(\n filter: {\n price: {gt: \"10\"}\n or: {\n sku:{like:\"%Product%\"}\n name:{like:\"%Configurable Product%\"}\n }\n }\n pageSize: 200\n currentPage: 1\n sort: {\n price: ASC\n name:DESC\n }\n ) {\n total_count\n items {\n attribute_set_id\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n short_description {\n html\n }\n sku\n small_image {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n \t... on PhysicalProductInterface {\n \tweight\n \t}\n }\n page_info {\n page_size\n current_page\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_filter_only.jmx graphql_multiple_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_multiple_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) < 200) { Failure = true; FailureMessage = "Expected \"totalCount\" to be greater than 200, Actual: " + totalCount; } else { Failure = false; } } false true false {"query":"{\n products(filter: {sku: { eq: \"${simple_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_simple_product_with_extensible_data_objects.jmx graphql_simple_products_query_total_count $.data.products.total_count BODY graphql_multiple_products_query_response $ BODY String totalCount=vars.get("graphql_simple_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) != 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; } else { Failure = false; } } false $.data.products.items[0].sku ${simple_product_sku} true false false true true false {"query":"{\n products(filter: {sku: {eq:\"${configurable_product_sku}\"} }) {\n total_count\n items {\n ... on PhysicalProductInterface {\n weight\n }\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_configurable_product_with_extensible_data_objects.jmx graphql_configurable_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_configurable_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) != 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; } else { Failure = false; } } false $.data.products.items[0].sku ${configurable_product_sku} true false false true true false {"query":"{\n products(\n search: \"configurable\"\n filter: {price: {gteq: \"1\"} }\n ) {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_and_filter.jmx graphql_search_products_query_total_count_fulltext_filter $.data.products.total_count BODY String totalCount=vars.get("graphql_search_products_query_total_count_fulltext_filter"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) < 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; } else { Failure = false; } } false true false {"query":"{\n products(search: \"configurable\") {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t\t}\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_only.jmx graphql_search_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_search_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) < 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; } else { Failure = false; } } false true false {"query":"{\n products(search: \"Option 1\") {\n filters {\n name\n filter_items_count\n request_var\n filter_items {\n label\n value_string\n items_count\n ... on SwatchLayerFilterItemInterface {\n swatch_data {\n type\n value\n }\n }\n }\n }\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n weight\n }\n ... on ConfigurableProduct {\n configurable_options {\n id\n attribute_id\n label\n position\n use_default\n attribute_code\n values {\n value_index\n label\n store_label\n default_label\n use_default_value\n }\n product_id\n }\n variants {\n product {\n ... on PhysicalProductInterface {\n weight\n }\n sku\n color\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n\n\n }\n attributes {\n label\n code\n value_index\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_multiple_products_with_extensible_data_objects_using_full_text_and_filters.jmx graphql_search_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_search_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) < 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be greater than zero, Actual: " + totalCount; } else { Failure = false; } } false true false {"query":"{\nproducts(filter: {sku: {eq:\"${bundle_product_sku}\"} }) {\n total_count\n items {\n ... on PhysicalProductInterface {\n weight\n }\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on BundleProduct {\n weight\n price_view\n dynamic_price\n dynamic_sku\n ship_bundle_items\n dynamic_weight\n items {\n option_id\n title\n required\n type\n position\n sku\n options {\n id\n qty\n position\n is_default\n price\n price_type\n can_change_quantity\n product {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n }\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_bundle_product_with_extensible_data_objects.jmx graphql_bundle_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_bundle_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) != 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; } else { Failure = false; } } false $.data.products.items[0].sku ${bundle_product_sku} true false false false true false {"query":"{\n products(filter: {sku: { eq: \"${downloadable_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n ... on DownloadableProduct {\n links_purchased_separately\n links_title\n downloadable_product_samples {\n id\n title\n sort_order\n sample_type\n sample_file\n sample_url\n }\n downloadable_product_links {\n id\n title\n sort_order\n is_shareable\n price\n number_of_downloads\n link_type\n sample_type\n sample_file\n sample_url\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_downloadable_product_with_extensible_data_objects.jmx graphql_downloadable_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_downloadable_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) != 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; } else { Failure = false; } } false $.data.products.items[0].sku ${downloadable_product_sku} true false false true $.data.products.items[0].downloadable_product_samples..title ["sample1","sample2"] true false false false $.data.products.items[0].downloadable_product_samples..title ["sample1","sample2"] true false false false true false {"query":"{\n products(filter: {sku: { eq: \"${virtual_product_sku}\" } })\n {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on PhysicalProductInterface {\n \t\t\tweight\n \t\t }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_virtual_product_with_extensible_data_objects.jmx graphql_virtual_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_virtual_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) != 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; } else { Failure = false; } } false $.data.products.items[0].sku ${virtual_product_sku} true false false true true false {"query":"{\nproducts(filter: {sku: {eq:\"${grouped_product_sku}\"} }) {\n total_count\n items {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n ... on GroupedProduct {\n weight\n items {\n qty\n position\n product {\n attribute_set_id\n categories\n {\n id\n position\n }\n country_of_manufacture\n created_at\n description {\n html\n }\n gift_message_available\n id\n image\n {\n url\n label\n }\n meta_description\n meta_keyword\n meta_title\n media_gallery_entries\n {\n disabled\n file\n id\n label\n media_type\n position\n types\n content\n {\n base64_encoded_data\n type\n name\n }\n video_content\n {\n media_type\n video_description\n video_metadata\n video_provider\n video_title\n video_url\n }\n }\n name\n new_from_date\n new_to_date\n options_container\n ... on CustomizableProductInterface {\n options\n {\n title\n required\n sort_order\n }\n }\n \n price {\n minimalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n maximalPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n regularPrice {\n amount {\n value\n currency\n }\n adjustments {\n amount {\n value\n currency\n }\n code\n description\n }\n }\n }\n product_links\n {\n link_type\n linked_product_sku\n linked_product_type\n position\n sku\n }\n short_description {\n html\n }\n sku\n small_image\n {\n url\n label\n }\n special_from_date\n special_price\n special_to_date\n swatch_image\n thumbnail\n {\n url\n label\n }\n tier_price\n tier_prices\n {\n customer_group_id\n percentage_value\n qty\n value\n website_id\n }\n type_id\n updated_at\n url_key\n url_path\n websites { id name code sort_order default_group_id is_default }\n }\n }\n }\n }\n }\n}\n","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_grouped_product_with_extensible_data_objects.jmx graphql_grouped_products_query_total_count $.data.products.total_count BODY String totalCount=vars.get("graphql_grouped_products_query_total_count"); if (totalCount == null) { Failure = true; FailureMessage = "Not Expected \"totalCount\" to be null"; } else { if (Integer.parseInt(totalCount) != 1) { Failure = true; FailureMessage = "Expected \"totalCount\" to be equal to 1, Actual: " + totalCount; } else { Failure = false; } } false $.data.products.items[0].sku ${grouped_product_sku} true false false true true false { "customer": { "email": "customer_${__time()}-${__threadNum}-${__Random(1,1000000)}@example.com", "firstname": "test_${__time()}-${__threadNum}-${__Random(1,1000000)}", "lastname": "Doe" }, "password": "test@123" } = ${request_protocol} ${base_path}rest/default/V1/customers POST true false true false false mpaf/tool/fragments/ce/graphql/query_frontend_customer.jmx customer_id $.id BODY ^\d+$ Assertion.response_data false 1 variable customer_id ${request_protocol} ${base_path}rest/default/V1/customers/${customer_id} GET true false true false false mpaf/tool/fragments/ce/api/check_customer.jmx $.id ${customer_id} true false false true customer_email $.email BODY true false { "username":"${customer_email}", "password":"test@123" } = ${request_protocol} ${base_path}rest/default/V1/integration/customer/token POST true false true false false mpaf/tool/fragments/ce/api/create_customer.jmx customer_token $ BODY true false {"query":"{\n customer {\n created_at\n group_id\n\n prefix\n firstname\n middlename\n lastname\n suffix\n email\n default_billing\n default_shipping\n\n dob\n taxvat\n\n id\n addresses {\n id\n customer_id\n region {\n region_code\n region\n region_id\n }\n region_id\n country_id\n street \n company\n telephone\n fax\n postcode\n city\n firstname\n lastname\n middlename\n prefix\n suffix\n vat_id\n default_shipping\n default_billing\n }\n is_subscribed\n }\n}","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_frontend_customer.jmx false import org.apache.jmeter.protocol.http.control.Header; sampler.getHeaderManager().removeHeaderNamed("Authorization"); sampler.getHeaderManager().add(new Header("Authorization","Bearer " + vars.get("customer_token"))); $.data.customer.lastname Doe true false false true true false {"query":"{\n category(id: 1) {\n name\n id\n level\n description\n path\n path_in_store\n url_key\n url_path\n children {\n id\n description\n default_sort_by\n children {\n id\n description\n level\n children {\n level\n id\n children {\n id\n }\n }\n }\n }\n }\n}","variables":null,"operationName":null} = ${request_protocol} ${base_path}graphql POST true false true false false mpaf/tool/fragments/ce/graphql/query_root_category.jmx graphql_category_query_name $.data.category.name BODY String name = vars.get("graphql_category_query_name"); if (name == null) { Failure = true; FailureMessage = "Not Expected \"children\" to be null"; } else { if (!name.equals("Root Catalog")) { Failure = true; FailureMessage = "Expected \"name\" to equal \"Root Catalog\", Actual: " + name; } else { Failure = false; } } false stoptest false 1 1 1 1395324075000 1395324075000 false mpaf/tool/fragments/ce/tear_down.jmx "${dashboard_enabled}" == "1" false true ${__property(environment)} = true environment true ${start_time} = true startTime true ${__time(yyyy-MM-dd'T'HH:mm:ss.SSSZ)} = true endTime true ${redis_host} = true stats_server 60000 200000 ${request_protocol} ${base_path}DeploymentEvent.php POST true false true false false Errors: Assertion.response_data false 6 30 ${host} / false 0 true true true false saveConfig true true true true true true true false true true false false false false false false false false 0 true true true true ${response_time_file_name} mpaf/tool/fragments/ce/common/aggregate_graph.jmx true