تنظيم مجموعة الاختبار
مع نمو المشاريع، تتم إضافة المزيد والمزيد من اختبارات التكامل بشكل حتمي. وهذا يزيد من وقت البناء ويُبطئ الإنتاجية.
لمنع ذلك، يجب تشغيل اختباراتك بالتوازي. يختبر WebdriverIO بالفعل كل مواصفات (أو ملف الميزات في Cucumber) بالتوازي داخل جلسة واحدة. ب شكل عام، حاول اختبار ميزة واحدة فقط لكل ملف مواصفات. حاول ألا يكون لديك الكثير أو القليل جدًا من الاختبارات في ملف واحد. (ومع ذلك، لا توجد قاعدة ذهبية هنا.)
بمجرد أن تحتوي اختباراتك على عدة ملفات مواصفات، يجب أن تبدأ في تشغيل اختباراتك بشكل متزامن. للقيام بذلك، قم بتعديل خاصية maxInstances في ملف التكوين الخاص بك. يسمح لك WebdriverIO بتشغيل اختباراتك بأقصى قدر من التزامن - مما يعني أنه بغض النظر عن عدد الملفات والاختبارات التي لديك، يمكن تشغيلها جميعًا بالتوازي. (هذا لا يزال خاضعًا لبعض القيود، مثل وحدة المعالجة المركزية لجهاز الكمبيوتر الخاص بك، وقيود التزامن، وما إلى ذلك.)
لنفترض أن لديك 3 قدرات مختلفة (Chrome و Firefox و Safari) وقمت بتعيين
maxInstancesإلى1. سيقوم مشغل اختبار WDIO بإنشاء 3 عمليات. لذلك، إذا كان لديك 10 ملفات مواصفات وقمت بتعيينmaxInstancesإلى10، سيتم اختبار جميع ملفات المواصفات في وقت واحد، وسيتم إنشاء 30 عملية.
يمكنك تحديد خاصية maxInstances عالميًا لتعيين السمة لجميع المتصفحات.
إذا كنت تدير شبكة WebDriver الخاصة بك، فقد يكون لديك (على سبيل المثال) سعة أكبر لمتصفح واحد عن الآخر. في هذه الحالة، يمكنك تحديد maxInstances في كائن القدرة الخاص بك:
// wdio.conf.js
export const config = {
// ...
// set maxInstance for all browser
maxInstances: 10,
// ...
capabilities: [{
browserName: 'firefox'
}, {
// maxInstances can get overwritten per capability. So if you have an in-house WebDriver
// grid with only 5 firefox instance available you can make sure that not more than
// 5 instance gets started at a time.
browserName: 'chrome'
}],
// ...
}
الوراثة من ملف التكوين الرئيسي
إذا كنت تقوم بتشغيل مجموعة الاختبار الخاصة بك في بيئات متعددة (مثل بيئة التطوير والتكامل)، قد يساعد استخدام ملفات تكوين متعددة في الحفاظ على إدارة الأمور.
مشابه لـ مفهوم كائنات الصفحة، أول شيء ستحتاجه هو ملف التكوين الرئيسي. يحتوي على جميع التكوينات التي تشاركها عبر البيئات.
ثم قم بإنشاء ملف تكوين آخر لكل بيئة، وقم بتكملة التكوين الرئيسي بتلك الخاصة بالبيئة:
// wdio.dev.config.js
import { deepmerge } from 'deepmerge-ts'
import wdioConf from './wdio.conf.js'
// have main config file as default but overwrite environment specific information
export const config = deepmerge(wdioConf.config, {
capabilities: [
// more caps defined here
// ...
],
// run tests on sauce instead locally
user: process.env.SAUCE_USERNAME,
key: process.env.SAUCE_ACCESS_KEY,
services: ['sauce']
}, { clone: false })
// add an additional reporter
config.reporters.push('allure')
تجميع مواصفات الاختبار في مجموعات
يمكنك تجميع مواصفات الاختبار في مجموعات وتشغيل مجموعات معينة فردية بدلاً من تشغيلها جميعًا.
أولاً، قم بتحديد المجموعات الخاصة بك في تكوين WDIO:
// wdio.conf.js
export const config = {
// define all tests
specs: ['./test/specs/**/*.spec.js'],
// ...
// define specific suites
suites: {
login: [
'./test/specs/login.success.spec.js',
'./test/specs/login.failure.spec.js'
],
otherFeature: [
// ...
]
},
// ...
}
الآن، إذا كنت تريد تشغيل مجموعة واحدة فقط، يمكنك تمرير اسم المجموعة كوسيط CLI:
wdio wdio.conf.js --suite login
أو، قم بتشغيل مجموعات متعددة في وقت واحد:
wdio wdio.conf.js --suite login --suite otherFeature
تجميع مواصفات الاختبار للتشغيل بالتسلسل
كما هو موضح أعلاه، هناك فوائد في تشغيل الاختبارات بشكل متزامن. ومع ذلك، هناك حالات يكون فيها من المفيد تجميع الاختبارات معًا لتشغيلها بالتسلسل في نسخة واحدة. أمثلة على ذلك هي بشكل رئيسي حيث توجد تكلفة إعداد كبيرة مثل ترجمة الشفرة أو تهيئة مثيلات سحابية، ولكن هناك أيضًا نماذج استخدام متقدمة تستفيد من هذه القدرة.
لتجميع الاختبارات للتشغيل في نسخة واحدة، قم بتعريفها كمصفوفة ضمن تعريف المواصفات.
"specs": [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
],
"./test/specs/test_b*.js",
],
في المثال أعلاه، سيتم تشغيل الاختبارات 'test_login.js' و'test_product_order.js' و'test_checkout.js' بشكل متسلسل في نسخة واحدة وسيتم تشغيل كل من اختبارات "test_b*" بشكل متزامن في نسخ فردية.
من الممكن أيضًا تجميع المواصفات المحددة في المجموعات، لذا يمكنك الآن أيضًا تحديد المجموعات بهذه الطريقة:
"suites": {
end2end: [
[
"./test/specs/test_login.js",
"./test/specs/test_product_order.js",
"./test/specs/test_checkout.js"
]
],
allb: ["./test/specs/test_b*.js"]
},
وفي هذه الحالة سيتم تشغيل جميع اختبارات مجموعة "end2end" في نسخة واحدة.
عند تشغيل الاختبارات بشكل متسلسل باستخدام نمط، سيقوم بتشغيل ملفات المواصفات بترتيب أبجدي
"suites": {
end2end: ["./test/specs/test_*.js"]
},
هذا سيشغل الملفات التي تطابق النمط أعلاه بالترتيب التالي:
[
"./test/specs/test_checkout.js",
"./test/specs/test_login.js",
"./test/specs/test_product_order.js"
]
تشغيل اختبارات محددة
في بعض الحالات، قد ترغب في تنفيذ اختبار واحد فقط (أو مجموعة فرعية من الاختبارات) من المجموعات الخاصة بك.
باستخدام المعلمة --spec، يمكنك تحديد أي مجموعة (Mocha، Jasmine) أو ميزة (Cucumber) يجب تشغيلها. يتم حل المسار نسبيًا من دليل العمل الحالي الخاص بك.
على سبيل المثال، لتشغيل اختبار تسجيل الدخول فقط:
wdio wdio.conf.js --spec ./test/specs/e2e/login.js
أو قم بتشغيل مواصفات متعددة في وقت واحد:
wdio wdio.conf.js --spec ./test/specs/signup.js --spec ./test/specs/forgot-password.js
إذا كانت قيمة --spec لا تشير إلى ملف مواصفات معين، فسيتم استخدامها بدلاً من ذلك لتصفية أسماء ملفات المواصفات المحددة في التكوين الخاص بك.
لتشغيل جميع المواصفات التي تحتوي على كلمة "dialog" في أسماء ملفات المواصفات، يمكنك استخدام:
wdio wdio.conf.js --spec dialog
لاحظ أن كل ملف اختبار يعمل في عملية مشغل اختبار واحدة. نظرًا لأننا لا نفحص الملفات مقدمًا (راجع القسم التالي للحصول على معلومات حول توجيه أسماء الملفات إلى wdio)، لا يمكنك استخدام (على سبيل المثال) describe.only في أعلى ملف المواصفات الخاص بك لتوجيه Mocha لتشغيل تلك المجموعة فقط.
ستساعدك هذه الميزة في تحقيق نفس الهدف.
عندما يتم توفير الخيار --spec، سيتجاوز أي أنماط محددة بواسطة معلمة specs على مستوى التكوين أو القدرة.
استبعاد اختبارات محددة
عند الحاجة، إذا كنت بحاجة إلى استبعاد ملف (ملفات) مواصفات معينة من التشغيل، يمكنك استخدام المعلمة --exclude (Mocha، Jasmine) أو الميزة (Cucumber).
على سبيل المثال، لاستبعاد اختبار تسجيل الدخول من تشغيل الاختبار:
wdio wdio.conf.js --exclude ./test/specs/e2e/login.js
أو، استبعاد ملفات مواصفات متعددة:
wdio wdio.conf.js --exclude ./test/specs/signup.js --exclude ./test/specs/forgot-password.js
أو، استبعاد ملف مواصفات عند التصفية باستخدام مجموعة:
wdio wdio.conf.js --suite login --exclude ./test/specs/e2e/login.js
إذا كانت قيمة --exclude لا تشير إلى ملف مواصفات معين، فسيتم استخدامها بدلاً من ذلك لتصفية أسماء ملفات المواصفات المحددة في التكوين الخاص بك.
لاستبعاد جميع المواصفات التي تحتوي على كلمة "dialog" في أسماء ملفات المواصفات، يمكنك استخدام:
wdio wdio.conf.js --exclude dialog
استبعاد مجموعة كاملة
يمكنك أيضًا استبعاد مجموعة كاملة حسب الاسم. إذا كانت قيمة الاستبعاد تتطابق مع اسم مجموعة محدد في التكوين الخاص بك ولا تبدو كمسار ملف، فسيتم تخطي المجموعة بأكملها:
wdio wdio.conf.js --suite login --suite checkout --exclude login
هذا سيشغل مجموعة checkout فقط، متخطيًا مجموعة login بالكامل.
تعمل الاستبعادات المختلطة (المجموعات وأنماط المواصفات) كما هو متوقع:
wdio wdio.conf.js --suite login --exclude dialog --exclude signup
في هذا المثال، إذا كان signup هو اسم مجموعة محدد، فسيتم استبعاد تلك المجموعة. سيقوم النمط dialog بتصفية أي ملفات مواصفات تحتوي على "dialog" في اسم الملف الخاص بها.
:::ملاحظة
إذا حددت كلاً من --suite X و--exclude X، فإن الاستبعاد يأخذ الأسبقية ولن يتم تشغيل المجموعة X.
:::
عندما يتم توفير الخيار --exclude، سيتجاوز أي أنماط محددة بواسطة معلمة exclude على مستوى التكوين أو القدرة.
تشغيل المجموعات ومواصفات الاختبار
قم بتشغيل مجموعة كاملة جنبًا إلى جنب مع المواصفات الفردية.
wdio wdio.conf.js --suite login --spec ./test/specs/signup.js
تشغيل مواصفات اختبار متعددة ومحددة
من الضروري أحيانًا - في سياق التكامل المستمر وغير ذ لك - تحديد مجموعات متعددة من المواصفات للتشغيل. تقبل أداة سطر أوامر wdio الخاصة بـ WebdriverIO أسماء الملفات المدخلة عبر الأنابيب (من find أو grep أو غيرها).
تتجاوز أسماء الملفات المدخلة عبر الأنابيب قائمة الأنماط العامة أو أسماء الملفات المحددة في قائمة spec بالتكوين.
grep -r -l --include "*.js" "myText" | wdio wdio.conf.js
ملاحظة: لن يؤدي هذا إلى تجاوز علامة --spec لتشغيل مواصفات واحدة.
تشغيل اختبارات محددة باستخدام MochaOpts
يمكنك أيضًا تصفية أي suite|describe و/أو it|test محدد تريد تشغيله عن طريق تمرير وسيطة خاصة بـ mocha: --mochaOpts.grep إلى CLI الخاص بـ wdio.
wdio wdio.conf.js --mochaOpts.grep myText
wdio wdio.conf.js --mochaOpts.grep "Text with spaces"
ملاحظة: سيقوم Mocha بتصفية الاختبارات بعد أن يقوم مشغل اختبار WDIO بإنشاء النسخ، لذلك قد ترى العديد من النسخ التي تم إنشاؤها ولكن لم يتم تنفيذها بالفعل.
استبعاد اختبارات محددة باستخدام MochaOpts
يمكنك أيضًا تصفية أي suite|describe و/أو it|test محدد تريد استبعاده عن طريق تمرير وسيطة خاصة بـ mocha: --mochaOpts.invert إلى CLI الخاص بـ wdio. تؤدي --mochaOpts.invert عملية عكسية لـ --mochaOpts.grep
wdio wdio.conf.js --mochaOpts.grep "string|regex" --mochaOpts.invert
wdio wdio.conf.js --spec ./test/specs/e2e/login.js --mochaOpts.grep "string|regex" --mochaOpts.invert
ملاحظة: سيقوم Mocha بتصفية الاختبارات بعد أن يقوم مشغل اختبار WDIO بإنشاء النسخ، لذلك قد ترى العديد من النسخ التي تم إنشاؤها ولكن لم يتم تنفيذها بالفعل.
إيقاف الاختبار بعد الفشل
باستخدام خيار bail، يمكنك أن تخبر WebdriverIO بإيقاف الاختبار بعد فشل أي اختبار.
هذا مفيد مع مجموعات الاختبار الكبيرة عندما تعرف بالفعل أن البناء الخاص بك سيفشل، ولكنك تريد تجنب الانتظار الطويل لتشغيل اختبار كامل.
يتوقع خيار bail رقمًا، يحدد عدد إخفاقات الاختبار التي يمكن أن تحدث قبل أن يوقف WebDriver تشغيل الاختبار بالكامل. القيمة الافتراضية هي 0، مما يعني أنه يقوم دائمًا بتشغيل جميع مواصفات الاختبار التي يمكن العثور عليها.
يرجى الاطلاع على صفحة الخيارات للحصول على معلومات إضافية حول تكوين bail.
تسلسل خيارات التشغيل
عند تحديد المواصفات التي سيتم تشغيلها، هناك تسلسل هرمي معين يحدد النمط الذي سيأخذ الأولوية. حاليًا، هذه هي الطريقة التي تعمل بها، من الأولوية الأعلى إلى الأدنى:
وسيطة CLI
--spec> نمطspecsللقدرة > نمطspecsللتكوين وسيطة CLI--exclude> نمطexcludeللتكوين > نمطexcludeللقدرة
إذا تم إعطاء معلمة التكوين فقط، فسيتم استخدامها لجميع القدرات. ومع ذلك، عند تحديد النمط على مستوى القدرة، سيتم استخدامه بدلاً من نمط التكوين. أخيرًا، أي نمط مواصفات محدد في سطر الأوامر سيتجاوز جميع الأنماط الأخرى المعطاة.
استخدام أنماط المواصفات المحددة حسب القدرة
عندما تحدد نمط مواصفات على مستوى القدرة، فإنه سيتجاوز أي أنماط محددة على مستوى التكوين. هذا مفيد عند الحاجة إلى فصل الاختبارات بناءً على قدرات الأجهزة المختلفة. في مثل هذه الحالات، من المفيد أكثر استخدام نمط مواصفات عام على مستوى التكوين، وأنماط أكثر تحديدًا على مستوى القدرة.
على سبيل المثال، لنفترض أن لديك دليلين، واحد لاختبارات Android، وآخر لاختبارات iOS.
قد يحدد ملف التكوين الخاص بك النمط على النحو التالي، للاختبارات غير المحددة للأجهزة:
{
specs: ['tests/general/**/*.js']
}
ولكن بعد ذلك، سيكون لديك قدرات مختلفة لأجهزة Android و iOS الخاصة بك، حيث يمكن أن تبدو الأنماط كما يلي:
{
"platformName": "Android",
"specs": [
"tests/android/**/*.js"
]
}
{
"platformName": "iOS",
"specs": [
"tests/ios/**/*.js"
]
}
إذا كنت تطلب كلتا هاتين القدرتين في ملف التكوين الخاص بك، فإن جهاز Android سيقوم بتشغيل الاختبارات فقط تحت مساحة الاسم "android"، واختبارات iOS ستشغل فقط الاختبارات تحت مساحة الاسم "ios"!
//wdio.conf.js
export const config = {
"specs": [
"tests/general/**/*.js"
],
"capabilities": [
{
platformName: "Android",
specs: ["tests/android/**/*.js"],
//...
},
{
platformName: "iOS",
specs: ["tests/ios/**/*.js"],
//...
},
{
platformName: "Chrome",
//config level specs will be used
}
]
}