[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"post:automation-popular-tools":3},{"id":4,"documentId":5,"title":6,"desc":7,"content":8,"image":9,"imageCard":10,"imageBackground":11,"slug":12,"publishedAt":13,"baseUrl":14,"tags":15,"writer":21,"editors":29,"organization":11,"vars":30},729,"rwtec3x8h1i7q4airw3ft2k2","مقایسه ابزارهای تست اتوماتیک","این مقاله، ابزارهای محبوب تست خودکار وب UI و API (ربات فریمورک، سلنیوم، سایپرس و پلی‌رایت) را مقایسه می‌کند.  هر ابزار با مثال عملی ورود به سیستم وب، و نقاط قوت و ضعف آن، به همراه زبان برنامه‌نویسی مورد استفاده، تشریح شده است.  انتخاب ابزار مناسب، به مهارت تیم، نوع تست و نیازهای سازمان بستگی دارد.\n","## معرفی ابزارها\nدر این مقاله ابزارهای محبوب تست اتوماتیک که توانایی خودکارسازی ارزیابی و آزمون در سطح Web UI و API را دارا \nمی‌باشند با یکدیگر مقایسه می‌شوند، هر ابزار نقاط قوت و ضعف خود را داراست که استفاده از آن بسته به نیاز پروژه شما و زمینه‌های تخصصی شما و تیم آزمون می‌باشد. در ادامه هر یک از ابزارهای زیر با یک مثال ساده ورود (لاگین) به سیستم تحت وب بررسی می‌شوند. ابزارهای مورد مقایسه:\n* ربات فریمورک Robot Framework\n* سلنیوم Selenium\n* سایپرس Cypress\n* پلی‌رایت Playwright\n\n\n## سلنیوم\nیک ابزار متداول و متن باز برای اتوماسیون تست صفحات وب است. از چندین زبان برنامه‌نویسی و مرورگر پشتیبانی می‌کند، و دارای جامعه بزرگی از کاربران و مشارکت‌کنندگان است. این ابزار قابلیت گسترش پذیری و انعطاف پذیری بالایی دارد و شما می‌توانید تحت زبان‌های جاوا، جاوااسکریپت و پایتون آن را پیاده‌سازی و از کتابخانه‌های آن استفاده کنید. اما توجه کنید که دانش پایه شما از این زبان‌های برنامه‌نویسی و توانایی درک و پیاده‌سازی مفاهیم شی‌گرایی از اهمیت ویژه‌ای برخوردار است و بدون آن نمی‌توان تست‌های بهینه‌ای را ایجاد کرد.\nدر این مثال با زبان برنامه‌نویسی جاوا و با استفاده از API سلنیوم (WebDriver API) برای تعامل با صفحه وب و بررسی پیام خوش آمدگویی استفاده شده است.\n\n```\n@Test\npublic void loginTest() {\n    WebDriver driver = new ChromeDriver();\n    driver.get(‘gazmeh.ir\u002Ffa\u002Fauth\u002Flogin’);\n    driver.findElement(By.id(\"username\")).sendKeys(username);\n    driver.findElement(By.id(\"password\")).sendKeys(password);\n    driver.findElement(By.id(\"login\")).click();\n    String welcomeMessage = driver.findElement(By.id(\"welcome\")).getText();\n    assertEquals(\"Welcome, \" + username + \"!\", welcomeMessage);\n}\n```\n\nدر مثال بالا، ابتدا در متغیر driver یک نسخه از وب‌درایور برای اتصال به مرورگر کروم ایجاد می‌شود. سپس در خط بعد مرورگر را به آدرس وب سایت گزمه-لاگین می‌بریم. در مرحله بعد با استفاده از جستجوگر المان‌های صفحه به نام findElement متن‌های یوزرنیم و پسورد را وارد textboxهای مربوطه میکنیم. سپس با دسترسی به کلید لاگین (با استفاده از id این کلید در محتوای HTML صفحه وب‌سایت)، عمل کلیک زدن بر روی آن را انجام می‌دهیم. در انتها به منظور صحت سنجی انجام کار، با استفاده از assertion ها عبارت خوش‌آمد گویی صفحه ابتدایی بررسی می‌گردد.\n\n\n## ربوت فریمورک\nاین یک فریمورک اتومیشن تست در سطح end-to-end است که از تکنولوژی‌ها و برنامه‌های مختلف پشتیبانی می‌کند. از رویکرد کلمات کلیدی یا keyword driven ها برای نوشتن تست کیس‌ها استفاده می‌کند، که به غیر از برنامه‌نویسان، به کاربران غیر برنامه‌نویس هم اجازه می‌دهد تست‌های خود را بسازند. ربوت فریمورک دارای اکوسیستم بزرگی از کتابخانه‌ها و ادغام‌ها است. این فریمورک تحت زبان Python پیاده‌سازی گردیده و مستندات و کتابخانه‌های وسیعی را در اختیار کاربران قرار‌ می‌دهد. از نکات مثبت دیگر ربوت فریمورک قابلیت شخصی‌سازی کلمات کلیدی برای کاربردهای خاص منظوره می‌باشد، به عنوان نمونه شما می‌توانید برای یک اکشن در صفحه وب یا یک API خاص دامین خودتان یک کلمه کلیدی تعریف کرده و پیاده‌سازی مربوطه را تحت آن انجام دهید، در ادامه در هر جای روند تست می‌توانید آن کلمه کلیدی را فراخوانی کرده و از آن استفاده کنید، این رویکرد همانند مفاهیم شی‌گرایی بوده و به تست کیس‌های شما قابلیت استفاده مجدد می‌دهید و هزینه نگهداشت و تغییرات آتی را کاهش ‌می‌دهد.\nدر این مثال، یک مرورگر باز شده و فیلدهای نام کاربری و رمز عبور در صفحه مربوط به لاگین وارد و پس از ورود بررسی می‌شود تا به صفحه welcomepage وارد شده باشیم. \nلازم به ذکر است ربوت از کتابخانه selenium برای تست‌های سطح UI استفاده می‌کند.\n\n```\n*** Test Cases ***\nLogin to Web APP\n    Open Browser    gazmeh.ir\u002Ffa\u002Fauth\u002Flogin    chrome\n    Input Text    username_field    ${username}\n    Input Text    password_field    ${password}\n    Click Button    login_button\n    Wait Until Page Contains    Welcome, ${username}\n```\n\nدر مثال بالا از کلمه‌کلیدی Open Browser که توسط کتابخانه سلنیوم پشتیبانی می‌شود به منظور باز کردم یک مرورگر و رفتن به آدرس گزمه-لاگین استفاده شده. همچنین با استفاده از Input Text فیلدهای نام کاربر و رمز عبور یافت و مقادیر آن وارد شده. در مرحله بعد بر روی دکمه Click Button ورود به سایت کلیک شده و در انتها تا زمان نمایش پیغام خوش‌آمد گویی، در حالت wait قرار گرفته. \nهمانطور که مشاهده می‌شود، خوانایی سناریو در این تست کیس کاملا مشهود بوده، به صورتی که شما با المان‌های کدنویسی مواجه نیستید و می‌توان این سناریو را برای همه اعضای تیم همانند Product Owner به اشتراک گذاشت. در انتها این ابزار کتابخانه‌های خوب و کارآمدی را برای تست سطح API‌ در اختیار شما قرار ‌می‌دهد.\n## سایپرس\nاین ابزار به منظور تست سطح  end-to-end و component کاربرد داشته و عمده تمرکز آن بر روی تست UI می‌باشد، اما قابلیت تست API را نیز دارا می‌باشد و با اجرای تست‌ها مستقیماً در مرورگر، تجربه تست سریع و قابل اعتمادی را فراهم می‌کند. این ابزار به صورت built-in یک دیباگ کننده کد را به همراه دارد و به راحتی می‌تواندی به روند و تنظیمات اجرای تست و نتایج آن دسترسی داشته باشید، اما برای تست در سطح API نیاز به نصب کتابخانه‌ و پلاگین‌های مجزایی هستید. این ابزار تحت زبان جاوااسکریپت یا تایپ‌ اسکریپت قابل توسعه بوده و همچنین به صورت پیشفرض توانایی خوبی در مدیریت استراتژی wait برای بارگذاری صفحات برخوردار است که مزیت بهتری نسبت به ابزارهای تحت سلنیوم به شمار می‌رود. \nدر این مثال، از دستورات سایپرس داخلی برای تعامل با صفحه وب و بررسی پیام خوش آمدگویی استفاده شده است.\n\n```\nit('Login Test', () => {\n  cy.visit(‘gazmeh.ir\u002Ffa\u002Fauth\u002Flogin’)\n  cy.get('#username').type(username)\n  cy.get('#password').type(password)\n  cy.get('#login').click()\n  cy.contains('Welcome, ' + username + '!')\n})\n```\n\nبه منظور توضیح بیشتر مثال بالا،‌ با استفاده از cy.visit مرورگر باز شده و به آدرس گزمه-لاگین می‌رویم. در مرحله بعد المان‌های صفحه به استفاده از دستور cy.get یافت شده و عبارت‌های نام کاربری و رمز عبور در آن‌ها وارد می‌شود. در ادامه بر روی گزینه لاگین کلیک کرده و در انتها بررسی می‌شود صفحه مورد نظر عبارت خوش‌آمد گویی را داشته باشد.\n\n\n## پلی‌رایت\nپلی‌رایت به تازگی توسط microsoft منتشر و مورد استقبال قرار گرفته است (برای بررسی این موضوع می‌توانید به پروژه گیت‌هاب هر یک از این ابزارها مراجعه و میزان مشارکت و محبوبیت آن را بررسی کنید) و قابلیت پشتیبانی از چندین مرورگر و زبان برنامه‌نویسی را دارد و همچنین دسترسی به قابلیت‌های مرورگر را تسهیل می‌کند. برخی از مزایای این ابزار عبارت است از:\n * تست چند مرورگر: Playwright تست چند مرورگر را برای Chrome، Firefox، Safari، WebKit و Microsoft Edge پشتیبانی می کند.\n* پشتیبانی به صورت پیشفرض از باز کردن و کنترل چند تب و پنجره، در حالی که Cypress برای این عملکرد نیاز به کتابخانه‌ یا پلاگین‌های مجزایی دارد.\n* پشتیبانی از زبان‌های برنامه‌نویسی بیشتر شامل JavaScript، TypeScript، Python و C# پشتیبانی می کند. \n* اتومیشن بهتر سناریوهای پیچیده مانند رهگیری درخواست‌های شبکه و شبیه‌سازی دستگاه‌های موبایل را دارا می‌باشد.\n\nدر بخش زیر یک مثال  از API پلی‌وارایت برای تعامل با صفحه وب و بررسی پیام خوش آمدگویی تحت جاوااسکریپت استفاده شده است.\n\n```\nasync function loginTest() {\n  const browser = await playwright.chromium.launch();\n  const page = await browser.newPage();\n  await page.goto(‘gazmeh.ir\u002Ffa\u002Fauth\u002Flogin’);\n  await page.fill('#username', username);\n  await page.fill('#password', password);\n  await page.click('#login');\n  await page.waitForSelector('text=Welcome, ' + username + '!');\n}\n```\n\nدر مثال بالا یک فانکشن async یا ناهمگام به دلیل ماهیت جاوااسکریپت تعریف شده است(در زبان‌های برنامه‌نویسی که خطوط به صورت async یا غیرهمروند همانند جاوااسکریپت، اجرا می‌شوند، به منظور تعیین تقدم هر اکشن می‌بایست گام بعدی منتظر نتیجه گام قبلی باشد تا دچار مشکل و خطا نگردیم، به عنوان نمونه  تا زمانی که مرورگر باز نشده و به آدرس مورد نظر نرفته نمی‌توان به دنبال المان‌های صفحه گشت، به دلیل زمان‌بر بودن گام ابتدایی ممکن است یافتن المان‌ها با مشکل مواجه شود). در خط دوم یک مرورگر از نوع کرمیوم اجرا شده و در خط بعدی یک صفحه جدید باز می‌شود. در مرحله بعد آدرس مورد نظر که صفحه گزمه-لاگین می‌باشد در صفحه وارد شده و با عبارت await منتظر می‌مانیم تا به صفحه منتقل شویم. به همین ترتیب در ادامه المان‌های نام‌کاربری و رمز عبور یافت شده و عبارات مورد نظر درج و بر روی دکمه لاگین کلیک می‌شود. در انتها با استفاده از عبارت await page.waitForSelector منتظر مانده تا پیام خوش‌آمد گویی نمایش داده شود.\n## کدام ابزار را انتخاب کنیم\nانتخاب ابزار مناسب اتومیشن یکی از پیچیده ترین مراحل خودکارسازی تست نرم‌افزار شما می‌باشد. پارامترهای مهمی مانند توانایی تیم شما برای توسعه و میزان تسلط به زبان‌های برنامه‌نویسی و شی‌گرایی عامل تعیین کننده بوده و هر چه این توانمندی بیشتر باشد میتوان ابزار بهتر و با قابلیت انعطاف بیشتری را انتخاب نمود. همچنین سطح آزمون شما از نظر UI , API  و یا end-to-end , component بسیار مهم بوده زیرا برخی از ابزارها توانمندی خوبی در سطح API یا موبایل به شما ارائه نمی‌دهند. همچنین بلوغ سازمانی از نظر استفاده از ابزار بسیار مهم بوده و شاید بنا به نیاز سازمان و اولویت‌های آن، ابزار پیچیده و یا ساده‌تری را برای پیاده‌سازی انتخاب کنید. همچنین توجه داشته باشید که هرچه ابزار از سادگی و در اختیار داشتن رابط کاربری بیشتری بهره‌ برد،‌ طیف وسیعی از افراد توانمندی کار با آن را دارا بوده ولی نمی‌توان تست‌های منعطف و با قابلیت نگهداشت بالا را در آن‌ها توسعه داد.\n","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Frefs\u002Fheads\u002Fmain\u002Ffa\u002Fautomation\u002Fpopular-tools\u002Fresources\u002FimageCover.png?raw=true","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Frefs\u002Fheads\u002Fmain\u002Ffa\u002Fautomation\u002Fpopular-tools\u002Fresources\u002FimageThumbnail.png?raw=true",null,"automation-popular-tools","2025-12-11T14:58:54.547Z","https:\u002F\u002Fraw.githubusercontent.com\u002Fgazmeh-site\u002Fposts\u002Frefs\u002Fheads\u002Fmain\u002Ffa\u002Fautomation\u002Fpopular-tools\u002F",[16],{"id":17,"documentId":18,"name":19,"localeName":20},4,"szefdrf8dqsu6ul557hbcizz","automation","خودکارسازی",{"id":17,"documentId":22,"username":23,"displayName":24,"avatar":25},"egw16j19yulaqlo77zc7f9p2","amiri","مهدی امیری",{"id":26,"documentId":27,"url":28},6,"gf2pjisnxyexpsyq1mln7gbq","\u002Fuploads\u002Famiri_resize_faafa86cc5.jpg",[],{"SITE_URL":31,"PAGES_URL":32,"POSTS_URL":33},"https:\u002F\u002Fgazmeh.ir\u002Ffa","https:\u002F\u002Fgazmeh.ir\u002Ffa\u002Fpages","https:\u002F\u002Fgazmeh.ir\u002Ffa\u002Fposts"]