Связать модуль npm «cheerio» в тесте K6

Я пытаюсь создать некоторые тесты, используя платформу K6 от LoadImpact, но я изо всех сил пытаюсь включить внешний модуль NPM, следуя инструкциям на их сайте документации.

На сайте документации loadImpacts есть подробный пример того, что мне нужно, модулей, которые позволяют мне анализировать xml из ответа службы мыла. Но я не могу заставить это работать! Теперь я полный новичок в javascript, но я много лет кодирую и очень хотел бы решить эту проблему. Их можно найти здесь: https://docs.k6.io/docs/modules#section-npm-modules кто-нибудь может заставить это работать? Мне нужно запустить это на серверах, изолированных от Интернета, поэтому я полностью зависим от создания пакетов и передачи необходимых файлов.

Согласно документации пакет создается так

-- bundle `cheerio` npm module
git clone [email protected]:cheeriojs/cheerio.git
npm install browserify index.js -s cheerio > cheerio.js

Мой первый вопрос: в папке, в которой я нахожусь, при выполнении этой команды создается файл «cheerio.js» вместе с папкой «cheerio» и папкой «node_modules». cheerio.js в моем «корневом» каталоге содержит только следующее:

+ [email protected]
+ [email protected]
+ [email protected]
updated 3 packages and audited 2829 packages in 2.221s
found 0 vulnerabilities

Вернемся к примеру LoadImpacts о том, как ссылаться на этот пакет в javascript k6:

import cheerio from "./vendor/cheerio.js";
export default function() 
{
  const res = http.get("https://loadimpact.com/");
  const $ = cheerio.load(res.body);

Что это за файл и где в структуре, сгенерированной браузером, я могу его найти? Я попытался изменить это, чтобы указать на «index.js» в папке «cheerio» или cheerio.js, найденный в «cheerio/lib». Затем я получу жалобу на первую строку в cheerio.js, которая определяет переменную «parse», которую она не может найти: var parse = require("./parse'), если я изменю это на var parse = require("./parse.js'), она продолжит жаловаться на отсутствие «htmlparser2», который я также могу найти в этой структуре. , но похоже, что вся структура зависимостей не работает.

Может ли кто-нибудь дать мне несколько советов о том, как создать пакет browserify с зависимостями для cheerio и как/что мне нужно скопировать в мой проект k6, чтобы это работало, как на сайте loadImpact.


person p.carlsen    schedule 06.05.2019    source источник


Ответы (1)


Документы k6 для этого определенно нуждаются в некоторых разъяснениях, которые я сделаю позже. Упомянутая в настоящее время папка vendor не является чем-то особенным, в документах просто отсутствует шаг для копирования файлов cheerio.js и xml2js.js, созданных браузером, в новую папку vendor в вашем проекте k6.

А пока я попытаюсь предложить упрощенное объяснение того, как добиться того же самого более простым способом:

  1. Создайте новую пустую папку и перейдите в нее в терминале
  2. Запустите npm install browserify cheerio там (игнорируйте предупреждения npm об отсутствии package.json или описания)
  3. Запустите ./node_modules/.bin/browserify ./node_modules/cheerio/ -s cheerio > cheerio.js в этой папке
  4. Полученный файл cheerio.js в корне папки должен быть файлом, который вы импортируете из скрипта k6:
import http from "k6/http";
import cheerio from "./cheerio.js";

export default function () {
    const res = http.get("https://loadimpact.com/");

    const $ = cheerio.load(res.body);

    console.log($('head title').text())
}

Это должно быть для одной библиотеки npm.

И если вам нужно использовать несколько пакетов npm, возможно, лучше потратить некоторое время на их объединение в один браузерный .js файл. Например, если вам нужны библиотеки cheerio и xml2js, упомянутые в документации k6, вы можете сделать что-то вроде этого:

  1. Создать новую пустую папку
  2. Добавьте в него что-то вроде следующего файла package.json:

    {
      "name": "k6-npm-libs-demo",
      "version": "0.0.1",
      "description": "just a simple demo of how to use multiple npm libs in k6",
      "main": "npm-main.js",
      "dependencies": {},
      "devDependencies": {
        "browserify": "*",
        "cheerio": "*",
        "xml2js": "*"
      },
      "scripts": {
        "install": "./node_modules/.bin/browserify npm-main.js -s npmlibs  > vendored-libs.js"
      },
      "author": "",
      "license": "ISC"
    }
    
    

    Конечно, если вам нужны другие библиотеки, отличные от cheerio и xml2js, вам нужно настроить параметры devDependencies.

  3. Добавьте файл npm-main.js следующим образом (опять же, настраивая нужные библиотеки):

    exports.xml2js = require('xml2js');
    exports.cheerio = require('cheerio');
    
  4. Откройте эту папку в терминале и запустите npm install. Это должно привести к созданию файла vendored-libs.js в корне папки, который вы можете использовать в k6 следующим образом:

    import http from "k6/http";
    import { cheerio, xml2js } from "./vendored-libs.js";
    
    export default function () {
        const res = http.get("https://loadimpact.com/");
    
        const $ = cheerio.load(res.body);
        console.log($('head title').text())
    
        var xmlString = '<?xml version="1.0" ?>' +
            '<items xmlns="http://foo.com">' +
            ' <item>Foo</item>' +
            ' <item color="green">Bar</item>' +
            '</items>'
    
        xml2js.parseString(xmlString, function (err, result) {
            console.log(JSON.stringify(result));
        });
    }
    
person na--    schedule 08.05.2019
comment
В качестве альтернативы для модулей Node вы можете сделать npx browserify -r cheerio -s cheerio > cheerio.js. Это будет использовать загрузчик модуля Node для получения точки входа модуля вместо необходимости угадывать путь к файлу. - person Stephen Clouse; 09.05.2019