Cucumber-js: أضف خطافات BeforeStep / AfterStep

تم إنشاؤها على ٤ يناير ٢٠١٨  ·  33تعليقات  ·  مصدر: cucumber/cucumber-js

مفيد للتحقق من الصحة بعد انتهاء كل خطوة. يجب أن يكون this النسخة العالمية

التعليق الأكثر فائدة

أهلا بكم،

أي تحديث على خطافات الخطوة؟ أو أي عمل حول تشغيل بعض التعليمات البرمجية قبل و / أو بعد تنفيذ كل خطوة؟

ال 33 كومينتر

charlierudolph أود المساعدة هنا ، لكني بحاجة إلى بعض المؤشرات حول الطريقة المناسبة لتنفيذه. أعتقد أنه كان هناك سكر نحوي AfterStep لـ registerHandler الذي تمت إزالته مؤخرًا. نظرت إلى support_code_library_builder / definition_helpers.js. لكن تحتاج إلى بعض المؤشرات حول كيفية تنفيذ هذه الخطافات.
شكرا
علي
ملاحظة: شكرًا لعودة تنسيق json الناتج.

السؤال هنا هو كيف يؤثر هذا على سير العمل؟ هل يمكن تعديل حالة نتيجة الخطوة أم أنها تعمل كخطوة أخرى يمكن أن تنجح / تفشل؟

حالة الاستخدام التي رأيتها في أحد التعليقات والتي أريد أيضًا استخدامها هي إنشاء لقطة شاشة بعد الخطوة. في روبي الخيار ، استخدمت الخطوة التالية التي توفر الوصول إلى كائن السيناريو.
يجب استخدام خطاف الخطوة اللاحقة IMHO فقط لحالات الاستخدام حيث يرغب المستخدم في استبطان نتيجة الخطوة ولكن لا ينبغي أن يكون قادرًا على تغيير النتيجة. أعتقد أيضًا أنه لا ينبغي أن تكون خطوة أخرى يمكن أن تمر / تفشل.

charlierudolph أنا أبحث عن حل مماثل أيضًا.
قبل أن يتم إهمال RegisterHandler ، استخدمت هذا الرمز لأخذ لقطة شاشة بعد الخطوات الفاشلة:

""
this.registerHandler ('StepResult'، function (event، callback) {
var stepResult = event.getPayloadItem ('stepResult') ،

if (stepResult.getStatus() == 'failed') {
  takeScreenshot()
    .then(function () {
      callback();
    });
} else {
  callback();
}});

""

الآن ليس لدي حل لهذا.

مرحبا،

لقد رأيت في معظم المواضيع التي قرأتها بخصوص خطاف BeforeStep / AfterStep أن حالة الاستخدام تأخذ شاشة طباعة. هذه ليست حالة الاستخدام الخاصة بي وأريد فقط التعبير عن حالات الاستخدام الأخرى لهذه الخطافات:

لقد استخدم مشروعي هذا. خطاف afterStep في الخيار 1.x من أجل:

  • جمع البيانات - مثل جميع الروابط الخارجية:
    element.all(by.css('a')).each(function(link) { link.getAttribute('href').then(function(href) { ... }); });

يتم بعد ذلك اختبار جميع الروابط الخارجية في بدلة اختبار منفصلة.

  • التحقق من وجود تكرارات لمعرف العنصر (الغرض هو التأكد من أن جميع المعرفات فريدة من نوعها لتتوافق مع معيار HTML وأيضًا يجعل إنشاء الاختبارات أسهل)
  • التحقق من وجود خطأ في البرنامج النصي (قد تقوم AfterStep بتعيين متغير لـ After hook لسيناريو الفشل الفعلي).
  • تجاهل تنبيهات المتصفح. بعض سيناريوهات الاختبار تجعل نافذة تنبيه متصفح الويب مفتوحة والتي قد نرغب في تجاهلها. ينطبق هذا بشكل خاص عند وجود عناصر نموذج وإدخال ، سينبه المتصفح ("لديك تغييرات غير محفوظة ...")

يتم استخدام الخيار 4.0.0 والمنقلة 4.0.14 حاليًا

ملاحظة جانبية: حالات الاستخدام الخاصة بنا لا تعمل بشكل صحيح مع هذا. AfterStep () في الخيار 1.xx لأنه لم يتم تصميمه بحيث يحتوي على هذا النوع من التعليمات البرمجية ، وقد رأينا مشاكل في ظروف السباق. لذلك قمنا بالترقية إلى Cucumber 4.0.0 وقمنا بتعطيل منطق AfterStep حتى يتوفر الدعم المناسب له.

مرحبا،

أي تحديثات بخصوص هذا قبل / بعد خطافات الخطوة؟
هل هناك أي حل بديل لخطاف AfterStep؟ أرغب في التقاط لقطة شاشة إذا فشل الاختبار المعين.

لا يتوفر "attach" بالنسبة لي لأننا تجاوزنا المُنشئ العالمي الافتراضي https://github.com/cucumber/cucumber-js/blob/master/docs/support_files/world.md

Thnx

مرحبًا @ gajo4256 ،

أنا أستخدم الخيار 4.0.0 وهذا المقتطف:

After(function (scenario) {
  if (scenario.result.status === Status.FAILED) {
    const World = this;

    return browser.takeScreenshot().then(function (buffer) {
      return World.attach(buffer, 'image/png');
    });
  }});

سيأخذ هذا لقطة شاشة بعد كل سيناريو فاشل. (إنه يعمل بالنسبة لي ، لأنه مع الخيار ، كلما فشلت خطوة ما ، سيفشل السيناريو بأكمله ، لذا فهو مطابق تقريبًا لـ "بعد فشل الخطوة".

آمل أن يساعد.

مرحبًا mracz ،

thnx ، لقد جربت هذا بالفعل (على الرغم من أنه سيكون أكثر ملاءمة لي بعد كل خطوة).
بما أنني قد تجاوزت مُنشئ World الافتراضي ، كيف يمكنني إرفاق متوفر مرة أخرى لي كما هو الحال في الحالة العادية؟

Thnx

مرحبًا @ gajo4256 ،

هذا ما لدي في تطبيق Custom world الخاص بي:

const { setWorldConstructor } = require('cucumber');

function CustomWorld( { attach } ) {
  this.attach = attach;
}

setWorldConstructor(CustomWorld);

mracz ، أفعل هذا حاليًا لكل خطوة:

    When('I do something', function () {
        return takeScreenshot(this, () => {
            return $(...).click();
        });
    });

حيث تكون وظيفة التقاط لقطة الشاشة كما يلي:

export function takeScreenshot(world, stepToExecute: () => promise.Promise<any>): promise.Promise<any> {
    return stepToExecute().then(() => {
        return doTakeScreenshot(world);
    }).catch((err) => {
        return doTakeScreenshot(world).then(() => {
            throw err;
        });
    });
}

function doTakeScreenshot(world) {
    return browser.takeScreenshot().then((screenshot) => {
        world.attach(screenshot, 'image/png');
    }).catch((err) => {
        console.warn('Could not create screenshot', err);
    });
}

ربما أكون دفاعيًا للغاية بشأن الاستثناءات ، لكنني بذلت قصارى جهدي حتى لا يتداخل الكود الإضافي مع نتائج الاختبار الحقيقية. أفضل ما يمكنني فعله الآن ، إن استخدام خطاف يعمل AfterStep سيجعلني أضيف عددًا أقل من النماذج المعيارية.

ومع ذلك ، فإن ما قد لا يفعله الخطاف على الأرجح هو تخطي لقطات الشاشة عندما أقوم بتأكيدات لا تغير الشاشة (وبالتالي فإن لقطة الشاشة ستكون عديمة الفائدة) ، على سبيل المثال Then some element is not shown . أعتقد أن كائنًا عالميًا قابل للتمديد يمكن أن يساعد هناك.

فيما يلي حالة استخدام أخرى لـ hooks AfterStep : انتظر حتى تتم مزامنة الأقران (باستخدام الساعات المتجهة أو الطوابع الزمنية lamport). تضمين التغريدة

أهلا بالجميع.
أنا في الواقع أعمل على هذه المشكلة.

نحن نبحث عن طريقة لالتقاط لقطة شاشة من جميع خطواتنا المختلفة.
في الوقت الحالي ، نفكر في تجاوز وظيفة StepDefinitions من الخيار.

لا تعرف ما إذا كانت أفضل طريقة ممكنة ، لذا من فضلك لا تتردد في إبداء رأيك حول هذا الموضوع!

لأي شخص يكافح ، إليك طريقة للقيام بذلك باستخدام غلاف وظيفة التعريف: https://github.com/PeerioTechnologies/peerio-icebear/blob/dev/test/e2e/code/hooks.js#L28

ستكون حالة الاستخدام الرئيسية لدينا مثل غيرها هنا: لقطات الشاشة ، ولكن استخدامها كأداة لتصحيح الأخطاء حتى نتمكن من رؤية ناتج كل خطوة إذا قمنا بتشغيل وضع التصحيح في التكوين الخاص بنا.

استخدام آخر: لدينا عدد قليل من الوسائط التي قد تظهر بعد فترات زمنية معينة على موقعنا. إذا مررنا بسيناريو ما ، فنحن نرغب في إجراء فحوصات للتأكد من وجود هذه النماذج على الصفحة بعد كل خطوة للتأكد من أن اختباراتنا ليست هشة بسبب هذه النماذج.

حالة استخدام أخرى: إذا أراد شخص ما إنشاء أداة إعداد تقارير كاملة مع لوحة القيادة (حالات الاختبار قيد التشغيل حاليًا ، وحالات الاختبار التي تم تشغيلها مسبقًا ، وما إلى ذلك) ، فيمكن للخيار النشر على الأداة في خطافات الخطوة للحصول على تحديث حول التقدم. إنه مثال غير عادي ، أعرف ، لكنه شيء أنا مهتم بالبحث فيه الآن بعد أن فكرت فيه.

KyleFairns ، أحتاج AfterStep للوحة القيادة كما ذكرت

مرحبا،

نريد التحقق مما إذا كان هناك أي خطأ جافا سكريبت بعد كل خطوة. ليس فقط الخطوات الفاشلة.
(الشيء نفسه مثل @ markus-lundin-86)
الآن لا يمكننا فعل ذلك إلا بعد كل سيناريو.
هل هذا على خريطة الطريق ، أم أن لدى أي شخص حلول أخرى؟

لقد اكتشفت للتو أن WebDriverIO لديه خطافات قبل الخطوة وبعدها للخيار مما يحل مشكلتي.

امل ان يساعد...

أهلا بكم،

أي تحديث على خطافات الخطوة؟ أو أي عمل حول تشغيل بعض التعليمات البرمجية قبل و / أو بعد تنفيذ كل خطوة؟

أهلا بكم،
في نفس الوضع مع @ Prasant-Sutaria.
أي تحديث على خطافات الخطوة أو الحل البديل؟
شكرا لك مقدما.

لا توجد تحديثات. ما زلت بانتظار شخص ما لتقديم طلب سحب لهذا الغرض.

هل هناك أي خارطة طريق أو أي شيء لهذا؟ نظرًا لأن هذه إحدى نقاط الضعف الرئيسية للحصول على هذه الميزة ، فقد يكون من الجيد إصدار بيان رسمي.

aslakhellesoy هل هناك قائمة مرجعية أو شيء ما يحتاج طلب السحب لتنفيذه؟ يحاول AFAIK # 1058 و # 1121 إحضار هذه الميزة ، أو بعض الطرق لحلها.

مرحبا شباب،
لقد أنشأت للتو علاقات عامة بخصوص هذه المشكلة: https://github.com/cucumber/cucumber-js/pull/1198.
اسمحوا لي أن أعرف إذا وجدت أنها مفيدة.

aslakhellesoy ، لقد أنشأت PR أعلاه (# 1198) لمعالجة هذه المشكلة / طلب الميزة. هل يمكنك إلقاء نظرة عليه ، أو توجيهي إلى شخص يجب علي الاتصال به؟
نسخة إلى: charlierudolph

أي تحديثات؟ نتطلع إلى الحصول عليها أيضًا :)

أرى 2 PRs @ leonardonelson91
أعتقد أنهم لم يجدوا أفضل طريقة لتنفيذ هذه الميزة
https://github.com/cucumber/cucumber-js/pull/1198
https://github.com/cucumber/cucumber-js/pull/1058

charlierudolph هل لديك رأي حول ما إذا كان يجب تشغيل الدالات المسجلة مقابل BeforeStep و AfterStep إذا انتهت مهلة الخطوة؟

مثل البعض الآخر هنا ، أستخدم setDefinitionFunctionWrapper لتحقيق شيء لقطات الشاشة ، والذي يعمل بشكل رائع إلا أنه ليس لدي أي طريقة لمعرفة وقت انتهاء مهلة خطوات الاختبار - أفضل ما يمكنني فعله هو توفير مهلة أقصر لـ أدوات المتصفح حتى يتم طرحها بينما لا تزال الخطوة نشطة. آمل أن أعمل على إصلاح setDefinitionFunctionWrapper لكنني أردت أن أعرف ما هو القصد هنا أيضًا.

أتوقع أن يتم تشغيل BeforeStep / AfterStep بغض النظر عما إذا كانت الخطوة تمر / تفشل (بسبب انقضاء المهلة أو غير ذلك)

فقط لإضافة حالة استخدام إضافية إلى هذا الأمر الذي لا يتعلق بلقطات الشاشة. أنا أختبر نظامًا مدفوعًا بالأحداث وتتسبب الاختبارات في إنشاء أحداث. ثم تتم قراءة هذه الأحداث وإنشاء تغييرات على النظام.

الخطوات التالية للتحقق من صحة النظام في الحالة المتوقعة التي تتطلب معالجة جميع الأحداث. أرغب في الحصول على القدرة على ضمان معالجة قائمة الانتظار بالكامل وعدم وجود أي شيء في حالة الانتظار قبل الانتقال إلى الخطوة التالية.

أقوم حاليًا بإجراء بعض الاقتراع لتيار الأحداث في خطوات التحقق من الصحة ، ولكن سيكون من الجيد وضعها في الخطاف. نظرًا لأنه من المتطلبات في كل مكان أن يكون النظام في حالة مستقرة قبل الانتقال إلى الخطوة التالية.

davidjgosscharlierudolph من فضلك ، هل يمكنك مساعدتي بنموذج رمز مثال من setDefinitionFunctionWrapper لتحقيق شيء لقطات الشاشة BeforeStep / AfterStep ؟، أحاول مع Nightwatch JS

مرحبًا RArkasali إليك مقتطفًا من مشروع أعمل عليه:

import {setDefinitionFunctionWrapper} from "cucumber";

setDefinitionFunctionWrapper(function(fn) {
    return async function(...args) {
        try {
            return await fn.apply(this, args);
        } catch (ex) {
            await this.takeScreenshot();
            throw ex;
        }
    };
});

(حيث takeScreenshot طريقة على World المخصص الخاص بك تقوم بأخذ لقطات الشاشة الفعلية. لست على دراية كافية بالساعة الليلية لمعرفة شكل ذلك ولكنني متأكد من أنك ستفعل يكون.)

لذلك سيأخذ هذا لقطة شاشة إذا كان هناك خطأ (مثل فشل التأكيد) من داخل وظيفة الخطوة. حقيقة أننا نعيد نتيجة خطأ واحد أمر مهم - لقد كنت مرتبكًا لفترة من الوقت بينما لم يتم التعامل مع خطوة بـ return "pending" ، حتى أدركت أنني كنت ابتلع قيمة الإرجاع.

أتمنى أن يساعدك هذا

أهلا بكم،
ما هو وضع هذه القضية؟ هل ما زالت بحاجة للمساعدة؟
أنا مهتم بـ BeforeStep و AfterStep ، لأنه سيساعدني في الحصول على ملف "log" يحتوي على جميع أسماء الخطوات ومعلومات السجل الإضافية. إنه أسهل قليلاً من إنشاء منسق مخصص.

تمت إضافة هذا بصرف النظر عن https://github.com/cucumber/cucumber-js/pull/1416

يتم إغلاق هذه المشكلات منذ إضافة الخطافات في https://github.com/cucumber/cucumber-js/pull/1416

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات