Cucumber-js: قم بتشغيل سيناريو محدد في الإصدار 3

تم إنشاؤها على ٥ سبتمبر ٢٠١٧  ·  25تعليقات  ·  مصدر: cucumber/cucumber-js

أهلا،

منذ الإصدار 3 ، لا يمكنك تشغيل سيناريو محدد داخل ملف ميزة. سيتم تشغيل جميع السيناريوهات.

السابق. مرحبا بالعالم. الميزة: 46

شكرا،
ماركو

ال 25 كومينتر

لدينا ميزات للتحقق من أن هذا يعمل: https://github.com/cucumber/cucumber-js/blob/v3.0.1/features/target_specific_scenarios_by_line.feature (وقد تحققت للتو من أنها لا تزال تعمل على مجموعة الاختبار الخاصة بـ cucumber-js) . هل هناك المزيد من التفاصيل حول هذا الموضوع يمكنك أن تعطيه؟ (نموذج هيكل المشروع والأمر الكامل الذي قمت بتشغيله) إذا قمت بتوفير ملف وسطر ، فلا يجب تشغيل جميع السيناريوهات. يجب أن يتم تشغيل السيناريوهات المطابقة فقط (أو لا شيء إذا لم يتطابق أي شيء).

مرحبا تشارلي ،

يرجى الاطلاع على مشروع الاختبار المرفق
test-cucumber.zip

أقوم بتشغيل Windows 10 ، باستخدام zsh ، ولكن نفس الشيء يحدث في PS.

نزّل مشروعك التجريبي وهو يعمل معي (على جهاز Mac). لدينا appveyor CI وقادرون على تشغيل الخيار هناك ونفس الاختبار.

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

هل يمكنك إجراء مزيد من التصحيح عن طريق إضافة بعض عبارات console.log إلى وحدة العقدة المثبتة؟ بعض الأماكن التي يجب النظر إليها عند طباعة argv الذي تم تمريره إلى cli/argv_parser وما هي مسارات الميزات التي يتم تمريرها إلى pickle_filter

وجدت المشكلة. يعمل في PS:

يحتوي الكائن featureUriToLinesMapping على المسارات تمامًا مثل ما يتم تمريره عند إجراء الاختبارات:

featureUriToLinesMapping: { '.\features\bar.feature': [ 3 ] }

حيث تم تطبيع uri لفلاتر المخلل من أجل:

uri: features\bar.feature

وبالتالي لا تتطابق مع this.featureUriToLinesMapping[uri];

أيضًا في cygwin ، يقوم عامل تصفية pickle بتطبيع المسار إلى تنسيق Windows بدلاً من UNIX:

featureUriToLinesMapping: {'features / bar.feature': [3]}
uri: features\bar.feature

charlierudolph كنت أواجه مشكلة مماثلة في الحصول على هذه الميزة لتشغيل سيناريو محدد برقم السطر. أنا أعمل على نظام Mac ولدي إعداد هذا المشروع:

https://github.com/gd46/dibellag-automation-framework

يمكنك تجربة تشغيل مثال مع:

npm test -- --browserName chrome --specs test/features/cucumber/transform.feature:14

وما زلت أرى جميع السيناريوهات في الميزة قيد التنفيذ.

@ gd46 إلقاء نظرة سريعة على المثال الذي يظهر في إطار العمل الخاص بك يستخدم --features وليس --specs

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

test/features/cucumber/transform.feature:14

تم تشغيل السيناريو الوحيد.

لذا لست متأكدًا من سبب كون مسار المواصفات مطلقًا إذا كان يلزم ذلك أو ما إذا كان يمكن أن يتطابق مع ما يمر به المستهلك كمواصفات. ولست متأكدًا من المكان الذي يتم فيه تحويل نمط المواصفات إلى مسار مطلق.

مما يمكنني قوله حتى الآن يبدو أن هذا الخط:

https://github.com/cucumber/cucumber-js/blob/master/src/cli/index.js#L67

إرجاع featurePaths كمسارات مطلقة. لذلك إذا كتبت المواصفات الخاصة بي على النحو التالي:

test/features/cucumber/transform.feature:14

أو

./test/features/cucumber/transform.feature:14

يخرج ليكون:

/Users/dibellag/dibellag-automation-framework/test/features/cucumber/transform.feature

والذي لا يسمح برقم سطر ملف مواصفات التشغيل لي.

@ gd46 يقوم منشئ التكوين بتوسيع مسارات المعالم لقراءة الملفات ولكن يتم الاحتفاظ بالمسارات غير الممتدة لخيارات التصفية. https://github.com/cucumber/cucumber-js/blob/master/src/cli/configuration_builder.js#L47

امممم حسنا. هل تعتقد أن القضية في منقلة؟ أرى داخل إطار عمل خيار المنقلة index.js export.run specification هو المسار المطلق.

charlierudolph لقد جربت ما كان يتحدث عنه @ mmuller99 فيما يتعلق بخاصية featureUriToLinesMapping. في حالتي لا أرى أنها مطابقة لأنها تحتوي على المسار المطلق ومقارنته بالمسار النسبي للمواصفات.

charlierudolph أنا قادر على اختبار المثال الخاص بي إذا قمت بتحديث هذا السطر:

https://github.com/cucumber/cucumber-js/blob/master/src/pickle_filter.js#L50

الى الآتى \ الى القادم \ الى الم:

let path = require('path')
 const lines = this.featureUriToLinesMapping[path.resolve(uri)]

كان هذا الاختراق القصير الخاص بي لرؤيته يعمل ضمن إعداد الاختبار الخاص بي.

اضطررت إلى إجراء اختبار path.normalize على كل من getFeatureUriToLinesMapping و matchesAnyLine للحصول على كل من السيناريو الخاص بي بالإضافة إلى اختبارات cucumber-js lib للنجاح. ليست جميلة ، مجرد اختبار سريع

pickle_filter.js

import _ from 'lodash'
import path from 'path'
import { TagExpressionParser } from 'cucumber-tag-expressions'

const FEATURE_LINENUM_REGEXP = /^(.*?)((?::[\d]+)+)?$/
const tagExpressionParser = new TagExpressionParser()

export default class PickleFilter {
  constructor({ featurePaths, names, tagExpression }) {
    this.featureUriToLinesMapping = this.getFeatureUriToLinesMapping(
      featurePaths || []
    )
    this.names = names || []
    if (tagExpression) {
      this.tagExpressionNode = tagExpressionParser.parse(tagExpression || '')
    }
  }

  getFeatureUriToLinesMapping(featurePaths) {
    const mapping = {}
    featurePaths.forEach(featurePath => {
      const match = FEATURE_LINENUM_REGEXP.exec(featurePath)
      if (match) {
        const uri = path.normalize(match[1])
        const linesExpression = match[2]
        if (linesExpression) {
          if (!mapping[uri]) {
            mapping[uri] = []
          }
          linesExpression
            .slice(1)
            .split(':')
            .forEach(function(line) {
              mapping[uri].push(parseInt(line))
            })
        }
      }
    })
    return mapping
  }

  matches({ pickle, uri }) {
    return (
      this.matchesAnyLine({ pickle, uri }) &&
      this.matchesAnyName(pickle) &&
      this.matchesAllTagExpressions(pickle)
    )
  }

  matchesAnyLine({ pickle, uri }) {
    const lines = this.featureUriToLinesMapping[path.normalize(uri || '')]
    if (lines) {
      return _.size(_.intersection(lines, _.map(pickle.locations, 'line'))) > 0
    } else {
      return true
    }
  }

  matchesAnyName(pickle) {
    if (this.names.length === 0) {
      return true
    }
    return _.some(this.names, function(name) {
      return pickle.name.match(name)
    })
  }

  matchesAllTagExpressions(pickle) {
    if (!this.tagExpressionNode) {
      return true
    }
    return this.tagExpressionNode.evaluate(_.map(pickle.tags, 'name'))
  }
}

@ mmuller99 شكرًا على النتائج التي توصلت إليها ، كنت أحاول حل سبب عدم

@ gd46 شكرا path.resolve . لذلك ، لا يلزم سوى path.resolve في كلا الموقعين

أرى ، شكرًا @ mmuller99. charlierudolph ما هي أفكارك حول القيام بمسار. حل على كل من مسار مواصفات الإدخال ومصدر معلومات تحديد الموقع عند إجراء هذه المقارنات للتأكد من دقة ذلك دائمًا؟

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

https://github.com/cucumber/cucumber-js/blob/master/src/pickle_filter_spec.js

من أجل التقاط هذه السيناريوهات.

charlierudolph أي أفكار؟

أنا جيد في استخدام path.resolve في كلا المكانين

Great @ mmuller99 هل ترغب في إنشاء العلاقات العامة منذ أن وجدت المشكلة؟ وإلا يمكنني إنشاء واحد إذا كنت بحاجة.

@ gd64 سأضيف العلاقات العامة ، هل هناك أي سيناريو (سيناريوهات) اختبار محددة نحتاج إلى إلقاء نظرة عليها؟

إذا كان بإمكانك إنشاء اختبار فاشل في pickle_filter_spec الذي تم إصلاحه باستخدام المسار ، فسيكون حل هذا أمرًا رائعًا

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

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