Skip to content

Commit

Permalink
CC-34875: Dev performance Phase 2. SAPI tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
bohdanyevtukhov committed Mar 4, 2025
1 parent 4c5faf2 commit a72faee
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 14 deletions.
11 changes: 8 additions & 3 deletions dashboards/k6-load-testing-results.json
Original file line number Diff line number Diff line change
Expand Up @@ -1677,11 +1677,16 @@
},
{
"selected": false,
"text": "SAPI5_get_carts_with_items",
"value": "SAPI5_get_carts_with_items"
"text": "SAPI5_get_carts_include_items",
"value": "SAPI5_get_carts_include_items"
},
{
"selected": false,
"text": "SAPI6_get_carts_items",
"value": "SAPI6_get_carts_items"
}
],
"query": "http_req_duration,http_req_blocked,http_req_connecting,http_req_looking_up,http_req_receiving,http_req_sending,http_req_waiting,SAPI7_post_checkout,SAPI9_post_checkout,SAPI15_post_cart_reorder,SAPI19_post_cart_reorder,SAPI16_post_cart_reorder,SAPI17_delete_carts,SAPI18_post_checkout,SAPI20_post_cart_reorder,SAPI21_delete_carts,SAPI22_post_checkout,S2_get_search,M8_get_mp_dashboard,SAPI2_get_catalog_search,SAPI3_get_concrete_products,SAPI4_get_carts,SAPI5_get_carts_with_items",
"query": "http_req_duration,http_req_blocked,http_req_connecting,http_req_looking_up,http_req_receiving,http_req_sending,http_req_waiting,SAPI7_post_checkout,SAPI9_post_checkout,SAPI15_post_cart_reorder,SAPI19_post_cart_reorder,SAPI16_post_cart_reorder,SAPI17_delete_carts,SAPI18_post_checkout,SAPI20_post_cart_reorder,SAPI21_delete_carts,SAPI22_post_checkout,S2_get_search,M8_get_mp_dashboard,SAPI2_get_catalog_search,SAPI3_get_concrete_products,SAPI4_get_carts,SAPI5_get_carts_include_items,SAPI6_get_carts_items",
"type": "custom"
}
]
Expand Down
31 changes: 24 additions & 7 deletions src/fixtures/cart.fixture.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ const DEFAULT_STOCK_NAME = 'Warehouse1';
const DEFAULT_MERCHANT_REFERENCE = 'MER000008';

export class CartFixture extends AbstractFixture {
constructor({ customerCount, cartCount = 1, itemCount = 1 }) {
constructor({ customerCount, cartCount = 1, itemCount = 1, emptyCartCount = 0 }) {
super();
this.customerCount = customerCount;
this.cartCount = cartCount;
this.itemCount = itemCount;
this.emptyCartCount = 0;
this.emptyCartCount = emptyCartCount;
this.repositoryId = EnvironmentUtil.getRepositoryId();
}

Expand All @@ -35,19 +35,36 @@ export class CartFixture extends AbstractFixture {
.filter((item) => item.attributes.key.startsWith(`${customer.attributes.key}Quote`))
.map((cart) => cart.attributes.data.uuid);

const emptyCarts = responseData
.filter((item) => item.attributes.key.startsWith(`${customer.attributes.key}EmptyQuote`))
.map((cart) => cart.attributes.data.uuid);

const product = responseData
.filter((item) => item.attributes.key.startsWith('productKey'))
.map((product) => product.attributes.data.sku);

return {
customerEmail: customer.attributes.data.email,
cartIds: carts,
emptyCartIds: emptyCarts,
productSkus: product,
};
});
}

static iterateData(data, vus = exec.vu.idInTest, iterations = exec.vu.iterationInScenario) {
const customerIndex = (vus - 1) % data.length;
const { customerEmail, cartIds } = data[customerIndex];
const { customerEmail, cartIds, emptyCartIds, productSkus } = data[customerIndex];
const cartIndex = iterations % cartIds.length;
const emptyCartIndex = iterations % emptyCartIds.length;
const product = productSkus[0];

return { customerEmail, idCart: cartIds[cartIndex] };
return {
customerEmail,
idCart: cartIds[cartIndex],
idEmptyCart: emptyCartIds[emptyCartIndex],
productSku: product,
};
}

_getCustomersWithQuotesPayload() {
Expand Down Expand Up @@ -158,7 +175,7 @@ export class CartFixture extends AbstractFixture {
}

_createProductPayload(index) {
const productKey = `product${index + 1}`;
const productKey = `productKey${index + 1}`;
let productOffer = [];
let product = [
{
Expand Down Expand Up @@ -315,8 +332,8 @@ export class CartFixture extends AbstractFixture {

_generateItems() {
return Array.from({ length: this.itemCount }, (_, i) => ({
sku: `#product${i + 1}.sku`,
abstractSku: `#product${i + 1}.abstract_sku`,
sku: `#productKey${i + 1}.sku`,
abstractSku: `#productKey${i + 1}.abstract_sku`,
quantity: 1,
unitPrice: this.defaultItemPrice,
productOfferReference: this.repositoryId === 'b2b-mp' ? `#productOffer${i + 1}.product_offer_reference` : null,
Expand Down
19 changes: 18 additions & 1 deletion src/resources/carts.resource.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,15 @@ export default class CartsResource extends AbstractResource {
return this.getRequest(`carts/${idCart}`);
}

getWithItems(idCart) {
getIncludeItems(idCart) {
return this.getRequest(`carts/${idCart}?include=items`);
}

postCartsItems(idCart, sku, quantity = 1) {
var payload = this._getCartsItemsPayload(sku, quantity);
return this.postRequest(`carts/${idCart}/items`, payload);
}

_getCreateCartPayload(cartName, isDefault = false) {
return {
data: {
Expand All @@ -39,4 +44,16 @@ export default class CartsResource extends AbstractResource {
},
};
}

_getCartsItemsPayload(sku, quantity) {
return {
data: {
type: 'items',
attributes: {
sku: sku,
quantity: quantity,
},
},
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@ const testConfiguration = {
...EnvironmentUtil.getDefaultTestConfiguration(),
id: 'SAPI5',
group: 'Cart',
metrics: ['SAPI5_get_carts_with_items'],
metrics: ['SAPI5_get_carts_include_items'],
thresholds: {
SAPI5_get_carts_with_items: {
SAPI5_get_carts_include_items: {
smoke: ['avg<600'],
load: ['avg<1200'],
},
Expand Down Expand Up @@ -42,7 +42,7 @@ export default function (data) {

group(testConfiguration.group, () => {
const cartsResource = new CartsResource(bearerToken);
const response = cartsResource.getWithItems(idCart);
const response = cartsResource.getIncludeItems(idCart);

metrics[testConfiguration.metrics[0]].add(response.timings.duration);
});
Expand Down
50 changes: 50 additions & 0 deletions src/tests/cart/SAPI6_cart_items_1.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { group } from 'k6';
import OptionsUtil from '../../utils/options.util';
import { createMetrics } from '../../utils/metric.util';
import EnvironmentUtil from '../../utils/environment.util';
import { CartFixture } from '../../fixtures/cart.fixture';
import AuthUtil from '../../utils/auth.util';
import CartsResource from '../../resources/carts.resource';

const testConfiguration = {
...EnvironmentUtil.getDefaultTestConfiguration(),
id: 'SAPI6',
group: 'Cart',
metrics: ['SAPI6_get_carts_items'],
thresholds: {
SAPI6_get_carts_items: {
smoke: ['avg<600'],
load: ['avg<1200'],
},
},
};

const { metrics, metricThresholds } = createMetrics(testConfiguration);
export const options = OptionsUtil.loadOptions(testConfiguration, metricThresholds);

export function setup() {
const dynamicFixture = new CartFixture({
customerCount: testConfiguration.vus,
cartCount: 0,
itemCount: 1,
emptyCartCount: testConfiguration.iterations,
});

return dynamicFixture.getData();
}

export default function (data) {
const { customerEmail, idEmptyCart, productSku } = CartFixture.iterateData(data);

let bearerToken;
group('Authorization', () => {
bearerToken = AuthUtil.getInstance().getBearerToken(customerEmail);
});

group(testConfiguration.group, () => {
const cartsResource = new CartsResource(bearerToken);
const response = cartsResource.postCartsItems(idEmptyCart, productSku);

metrics[testConfiguration.metrics[0]].add(response.timings.duration);
});
}

0 comments on commit a72faee

Please sign in to comment.