Browse Source

chore: Update load testing scripts

Michael Bromley 5 years ago
parent
commit
61fc6c7f30

+ 1 - 1
packages/dev-server/README.md

@@ -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`

+ 10 - 5
packages/dev-server/load-testing/graphql/shop/add-to-order.graphql

@@ -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
+        }
     }
 }

+ 10 - 4
packages/dev-server/load-testing/graphql/shop/complete-order.graphql

@@ -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 - 0
packages/dev-server/load-testing/init-load-test.ts

@@ -148,6 +148,8 @@ function generateMockData(productCount: number, writeFn: (row: string[]) => void
         'taxCategory',
         'variantAssets',
         'variantFacets',
+        'stockOnHand',
+        'trackInventory',
     ];
 
     writeFn(headers);
@@ -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[]);
     }

+ 39 - 0
packages/dev-server/load-testing/scripts/very-large-order2.js

@@ -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)];
+}