PM2 Testcafe fs операция вызывает сбой - PullRequest
0 голосов
/ 04 ноября 2019

Если я запускаю свое приложение с использованием TestCafe в pm2, pm2 всегда падает, если сценарий Testcafe использует операции FS.

        async function unlinkFiles () {
            if(fs.existsSync(downloadsFolder()+'/export.xml')){
                fs.unlinkSync(downloadsFolder()+'/export.xml');
            }
            if(fs.existsSync(downloadsFolder()+'/export.json')){
                fs.unlinkSync(downloadsFolder()+'/export.json');
            }
            return true;
        }

Если я закомментирую эту операцию fs, pm2 не будет аварийно завершаться в этой позиции, но позже. Поэтому каждый раз, когда я использую операции FS в скрипте TestCafe в pm2, pm2 будет зависать. Это известная проблема?

Мой сценарий:

import { Selector, ClientFunction } from 'testcafe'; 
import fs from "fs"; 
import downloadsFolder from "downloads-folder"; 
import xpath from 'xpath'; 
import jp from 'jsonpath'; 
import {DOMParser} from 'xmldom'; 

fixture `SMTest 1-11-2019 (23:31:12)`

const getStyleWidthInPercents = ClientFunction(() => { 
   var calVar = Math.min(100, parseInt(document.querySelector('.progress-bar.progress-bar-success').style.width)) + '%'; 
   return calVar; 
}); 

const compareValues = ClientFunction(test1 => { 
   const enumVar = document.querySelector(test1).innerHTML; 
   return enumVar; 
}); 


test
    .httpAuth({
        username: 'xxx',
        password: 'xxx'
    })
    ('RV_mvK22', async t => {
        console.log('tcafeprogress:0');
        await t
            .navigateTo("xxx")
            .resizeWindow(1280, 720)

        async function unlinkFiles () {
            if(fs.existsSync(downloadsFolder()+'/export.xml')){
                fs.unlinkSync(downloadsFolder()+'/export.xml');
            }
            if(fs.existsSync(downloadsFolder()+'/export.json')){
                fs.unlinkSync(downloadsFolder()+'/export.json');
            }
            return true;
        }

        console.log('tcafeprogress:5');

        await t
            .expect(await unlinkFiles()).ok()

        await t
            .wait(2000)
            .click(Selector('a').withText('Regelwerk'))
            //.typeText(Selector('#settingsTable_filter').find('.form-control.input-sm'), 'tcafe')
            //.wait(2000)
            .click(Selector('button').withText('Upload'))

        console.log('tcafeprogress:10');

        await t
            .setFilesToUpload(Selector('#fileupload'), ['./uploads/RV_mvk2.xml'])
            .wait(2000)

        //Cheap Developed UI with Workaround here
        await t
            .expect(getStyleWidthInPercents()).eql('100%', {timeout: 90000})

        console.log('tcafeprogress:20');
        await t
            .wait(2000)
            .click(Selector('.btn.btn-secondary.close-button[data-dismiss="modal"]'))
            .wait(2000)


            //Upload success, now search and create XML
            .typeText(Selector('#settingsTable_filter').find('.form-control.input-sm'), 'RV_mvk2.xml')
            .wait(2000)
            //.debug()
            .click(Selector('button').withText('Erstellen'))
        console.log('tcafeprogress:30');

        //Prüfen ob das Fenster zu geht, wenn nicht dann abbrechen.
            //Vielleicht die ID Exists?
        await t
            .expect(Selector('#ContainerId').exists).ok('War wohl nicht erfolgreich',{ timeout: 300000 })

        const korpusid = await Selector('#ContainerId').innerText;

        console.log('tcafeprogress:40');

        //If fail, please note that the report will always report one step more.
        const value0 = await Selector('#KH').value 
await t 
  .expect(compareValues('#KH_value')).eql(value0,'Wertvergleich fehlgeschlagen', {timeout: 40000}) 
const value1 = await Selector('#KB').value 
await t 
  .expect(compareValues('#KB_value')).eql(value1,'Wertvergleich fehlgeschlagen', {timeout: 40000}) 
const value2 = await Selector('#KT').value 
await t 
  .expect(compareValues('#KT_value')).eql(value2,'Wertvergleich fehlgeschlagen', {timeout: 40000}) 
const value3 = await Selector('#Plattendicke').value 
await t 
  .expect(compareValues('#Plattendicke_value')).eql(value3,'Wertvergleich fehlgeschlagen', {timeout: 40000}) 
const value4 = await Selector('#Schiene_Size_x').value 
await t 
  .expect(compareValues('#Size_x_value')).eql(value4,'Wertvergleich fehlgeschlagen', {timeout: 40000}) 
  .wait(2000) 


        console.log('tcafeprogress:50');

        //XML DOWNLOAD
        await t
            .click(Selector('button').withText('Aktionen'))
            .click(Selector('a').withText('Xml Exportieren'));
        await t
            .wait(6000)
        await t  .expect(fs.existsSync(downloadsFolder()+'/export.xml')).ok()


        //JSON DOWNLOAD
        await t
            .click(Selector('button').withText('Aktionen'))
            .click(Selector('a').withText('Preis Exportieren'))
        await t
            .wait(6000)
        await t.expect(fs.existsSync(downloadsFolder()+'/export.json')).ok()

        console.log('tcafeprogress:70');


        //Nun müssten das XML öffnen und XPATH lesen.
        async function getXMLInfo (path,attr) {
            var xml = fs.readFileSync(downloadsFolder()+'/export.xml', 'utf8').toString();
            var doc = new DOMParser().parseFromString(xml);
            var enumeration = '';
            if(attr===true){
                enumeration = xpath.select1(path, doc).value;
            }else{
                enumeration = xpath.select(path, doc);
            }

            var noXML = enumeration.toString();
            noXML = noXML.replace(/\n|  |   /g, ' ');
            noXML = noXML.replace(/ {1,}/g,' ');

            console.log(noXML);
            return noXML;
        }

        await t 
    .expect(await getXMLInfo('//CCSYSTEMCABINETID[1]/text()[1]',false)).eql(korpusid,'XML Wertvergleich fehlgeschlagen', {timeout: 40000}) 
await t 
    .expect(await getXMLInfo('//CabinetPart[@id=\'ID0001\'][1]/@name',true)).eql('Unterboden','XML Wertvergleich fehlgeschlagen', {timeout: 40000}) 
await t 
    .expect(await getXMLInfo('//ExternalPart[1]/@identifier',true)).eql('schiene_xyz','XML Wertvergleich fehlgeschlagen', {timeout: 40000}) 
await t 
    .expect(await getXMLInfo('//ExternalPart[1]/@length',true)).eql('1000','XML Wertvergleich fehlgeschlagen', {timeout: 40000}) 
await t 
    .expect(await getXMLInfo('//point[4]/@coordinate',true)).eql('1200 23 0','XML Wertvergleich fehlgeschlagen', {timeout: 40000}) 


        console.log('tcafeprogress:80');

        async function getJSONInfo (path) {
            var xml = fs.readFileSync(downloadsFolder()+'/export.json', 'utf8').toString();

            if(path==='$..*'){
                console.log("Alles");
                return xml;
            }

            var enumeration = jp.query(JSON.parse(xml), path);

            console.log(enumeration.toString());
            return enumeration.toString();
        }

        await t 
   .expect(await getJSONInfo('$..CumulatedList[1].Name')).eql('schiene_xyz','JSON Wertvergleich fehlgeschlagen', {timeout: 40000}) 


        console.log('tcafeprogress:100');

    });

Сбой PM2 с отчетом. Я не знаю, почему отображается ошибка JSON, потому что на этом шаге нет функции JSON. Отладив код с помощью метода try and error, я смог свести проблему к операциям узла fs.

crash pm2

1 Ответ

0 голосов
/ 05 ноября 2019

Для всех, у кого похожая проблема. В моем случае проблема заключалась в том, что дочерний процесс выполнялся внутри модуля узла «download-folder». После удаления оператора Exec сбой исчез.

...