تنظيم مجموعة الاختبارات
مع نمو المشاريع، لا مفر من إضافة المزيد والمزيد من اختبارات التكامل. هذا يزيد من وقت البناء ويبطئ الإنتاجية.
لمنع هذا، يجب عليك تشغيل اختباراتك بالتوازي. يختبر 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
عند توفير خيار --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
إلى واجهة سطر أوامر 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
إلى واجهة سطر أوامر 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
}
]
}