سازماندهی مجموعه آزمون
با رشد پروژهها، به طور اجتنابناپذیر آزمونهای یکپارچهسازی بیشتری اضافه میشوند. این امر زمان ساخت را افزایش داده و بهرهوری را کاهش میدهد.
برای جلوگیری از این مشکل، باید آزمونهای خود را به صورت موازی اجرا کنید. WebdriverIO هر نمونه آزمون (یا فایل ویژگی در Cucumber) را در یک جلسه واحد به صورت موازی آزمایش میکند. به طور کلی، سعی کنید فقط یک ویژگی را در هر فایل آزمون بررسی کنید. سعی کنید تعداد آزمونها در یک فایل نه خیلی زیاد باشد و نه خیلی کم. (البته هیچ قانون طلایی در اینجا وجود ندارد.)
زمانی که آزمونهای شما چندین فایل مشخصات دارند، باید اجرای همزمان آزمونها را شروع کنید. برای انجام این کار، ویژگی maxInstances
را در فایل پیکربندی خود تنظیم کنید. WebdriverIO به شما اجازه میدهد آزمونهای خود را با حداکثر همزمانی اجرا کنید - به این معنی که صرف نظر از تعداد فایلها و آزمونها، همه آنها میتوانند به صورت موازی اجرا شوند. (البته این مورد هنوز تابع محدودیتهای خاصی مانند CPU کامپیوتر شما، محدودیتهای همزمانی و غیره است.)
فرض کنید شما ۳ قابلیت مختلف (Chrome، Firefox و Safari) دارید و
maxInstances
را1
تنظیم کردهاید. اجراکننده آزمون WDIO ۳ فرآیند را ایجاد میکند. بنابراین، اگر ۱۰ فایل مشخصات داشته باشید وmaxInstances
را10
تنظیم کنید، تمام فایلهای مشخصات به طور همزمان آزمایش میشوند و ۳۰ فرآیند ایجاد میشود.
میتوانید ویژگی 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
همچنین میتوانید با ارسال یک آرگومان خاص موکا: --mochaOpts.grep
به CLI wdio، فیلتر کنید که کدام suite|describe
و/یا it|test
خاص را میخواهید اجرا کنید.
wdio wdio.conf.js --mochaOpts.grep myText
wdio wdio.conf.js --mochaOpts.grep "Text with spaces"
توجه: Mocha آزمونها را پس از ایجاد نمونهها توسط اجراکننده آزمون WDIO، فیلتر میکند، بنابراین ممکن است چندین نمونه ایجاد شده را ببینید، اما در واقع اجرا نمیشوند.
حذف آزمونهای خاص با MochaOpts
همچنین میتوانید با ارسال یک آرگومان خاص موکا: --mochaOpts.invert
به CLI wdio، فیلتر کنید که کدام suite|describe
و/یا it|test
خاص را میخواهید حذف کنید. --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
}
]
}