Skip to content

Commit

Permalink
chore: Update load testing scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelbromley committed Feb 15, 2021
1 parent 6917cbd commit 61fc6c7
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 10 deletions.
2 changes: 1 addition & 1 deletion packages/dev-server/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ This package also contains scripts for load testing the Vendure server. The load

Load testing is done with [k6](https://docs.k6.io/), and to run them you will need k6 installed and (in Windows) available in your PATH environment variable so that it can be run with the command `k6`.

The load tests assume the existence of the following tables in the MySQL database:
The load tests assume the existence of the following tables in the database:

* `vendure-load-testing-1000`
* `vendure-load-testing-10000`
Expand Down
15 changes: 10 additions & 5 deletions packages/dev-server/load-testing/graphql/shop/add-to-order.graphql
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
mutation ($id: ID! $qty: Int!) {
addItemToOrder(productVariantId: $id quantity: $qty) {
id
code
lines {
...on Order {
id
quantity
productVariant {
code
lines {
id
quantity
productVariant {
id
}
}
}
...on ErrorResult {
errorCode
}
}
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
mutation SetShippingMethod($id: ID!) {
setOrderShippingMethod(shippingMethodId: $id) {
code
...on Order {
code
}
}
transitionOrderToState(state: "ArrangingPayment") {
code
...on Order {
code
}
}
addPaymentToOrder(input: {
method: "example-payment-provider",
metadata: {}
}) {
code
state
...on Order {
code
state
}
}
}
4 changes: 4 additions & 0 deletions packages/dev-server/load-testing/init-load-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,8 @@ function generateMockData(productCount: number, writeFn: (row: string[]) => void
'taxCategory',
'variantAssets',
'variantFacets',
'stockOnHand',
'trackInventory',
];

writeFn(headers);
Expand All @@ -168,6 +170,8 @@ function generateMockData(productCount: number, writeFn: (row: string[]) => void
taxCategory: 'standard',
variantAssets: '',
variantFacets: '',
stockOnHand: '1000',
trackInventory: 'false',
};
writeFn(Object.values(outputRow) as string[]);
}
Expand Down
39 changes: 39 additions & 0 deletions packages/dev-server/load-testing/scripts/very-large-order2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// @ts-check
import { check } from 'k6';
import { ShopApiRequest } from '../utils/api-request.js';

const searchQuery = new ShopApiRequest('shop/search.graphql');
const addItemToOrderMutation = new ShopApiRequest('shop/add-to-order.graphql');

export let options = {
stages: [{ duration: '1m', target: 1 }],
};

export function setup() {
const searchResult = searchQuery.post();
const items = searchResult.data.search.items;
return items;
}

/**
* Continuously adds random items to a single order for the duration of the test.
* Just like very-large-order.js but adds hundreds of items each time, and runs for only 1 minute
*/
export default function (products) {
for (let i = 0; i < 10000; i++) {
addToCart(randomItem(products).productVariantId);
}
}

function addToCart(variantId) {
const qty = Math.ceil(Math.random() * 500);
const result = addItemToOrderMutation.post({ id: variantId, qty });
check(result.data, {
'Product added to cart': r =>
!!r.addItemToOrder.lines.find(l => l.productVariant.id === variantId && l.quantity >= qty),
});
}

function randomItem(items) {
return items[Math.floor(Math.random() * items.length)];
}

0 comments on commit 61fc6c7

Please sign in to comment.