مرحبا.في هذه المقالة ، أود أن أشارك تجربتي في أتمتة الاختبار الوظيفي. سيكون حول كتابة إطار اختبار مناسب وموثوق.ما سنستخدمه: Java ، Selenide ، Alure ، TestNG ، Maven.
المقدمة
مشروع GitHub - SelenideBoilerplate .في كثير من الأحيان في مقالات عن أتمتة الاختبار ، الأمثلة بعيدة عن الواقع ، على سبيل المثال:driver.get (“URL”)
driver.find_element_by_id(“ID”).send_keys(“username”)
driver.find_element_by_id (“ID”).send_keys(“password”)
driver.find_element_by_id(“submit”).click()
هناك العديد من الأمثلة المماثلة للتوقعات وكائنات الصفحة وما إلى ذلك. ونتيجة لذلك ، قد يكون من الصعب على المختبر المبتدئ تنظيم كل شيء بشكل صحيح ومريح. المشروع متضخم بالعكازات ، لذلك أصبح من الصعب بشكل متزايد كتابة اختبارات جديدة والحفاظ على القديمة.هناك أيضًا بعض الأدوات المطلقة والمعقدة في رأيي.سوف أعرض إطار اختبار بسيط ومريح وقابل للتوسيع بسهولة ، وهو أسهل بكثير في العمل من السيلينيوم العادي والذي استخدمته بنجاح في العديد من المشاريع. هذا المشروع هو الأساس ، في المشاريع الحقيقية ، كل شيء أكثر تعقيدًا بعض الشيء (التوازي ، RemoteDriver ، العديد من الاختبارات ، إلخ).أدوات
هيكل المشروع
دعونا نبدأ مع التطبيق و صفحات وحدات .فئة PageBuilder
عادة ، تعطي الأمثلة صفحات بسيطة إلى حد ما حيث يناسب كل شيء في فصل واحد. ولكن في المشاريع الحقيقية ، قد تكون هناك صفحات كبيرة جدًا ، تصف جميع الوظائف التي ليست أفضل فكرة في فئة واحدة. على سبيل المثال ، قد تكون هذه صفحة إعادة شحن تحتوي على العديد من أشكال أنظمة الدفع المختلفة.في هذه الحالة ، من الأفضل تقسيم الصفحة إلى عدة فئات وحتى عناصر (على سبيل المثال ، منتج في السلة) وتجميعها معًا في الفئة الرئيسية للصفحة.لذلك ، من الأفضل إنشاء جميع الصفحات في مكان واحد ، وبالتحديد في فئة PageBuilder .package app;
import app.pages.LoginPage;
public class PageBuilder {
public static LoginPage buildLoginPage() {
return new LoginPage("/login");
}
public static BalancePage buildBalancePage() {
DepositForm depositForm = new DepositForm();
WithdrawalForm withdrawalForm = new WithdrawalForm();
return new BalancePage("/balance", depositForm, withdrawalForm);
}
}
فئة AppConfig
يخزن فئة AppConfig إعدادات تطبيق الويب قيد الاختبار. على سبيل المثال - عنوان الموقع ومستخدمي الاختبار وما إلى ذلك. في هذا المشروع ، هذا هو ببساطة عنوان الموقع.package app;
public class AppConfig {
public static final String baseUrl = "https://google.com";
}
فئة التطبيق
هذه هي الفئة الرئيسية في هذه الوحدة. يتم إنشاء كافة الصفحات في مُنشئ فئة التطبيقات .package app;
import app.pages.LoginPage;
public class App {
public LoginPage loginPage;
public App() {
loginPage = PageBuilder.buildLoginPage();
}
}
بفضل هذا النهج ، ليس من الضروري إنشاء كائنات الصفحة باستمرار في الاختبارات ، حيث يتم فقط إنشاء كائن التطبيق الذي يتم الحصول على الصفحات الضرورية منه.أيضًا في فئة التطبيقات ، قد تكون هناك طرق مثل - التسجيل والتسجيل وإنشاء الطلب ، إلخ.وهذا هو ، العمليات الكبيرة التي تتضمن العديد من كائنات الصفحة والتي غالبًا ما تكون مطلوبة في الاختبارات.دعنا ننتقل إلى كائنات الصفحة
بفضل Selenide ، من السهل العمل مع كائنات الصفحة. ترث جميع الصفحات من الفئة الأساسية BasePage . يتم تمرير عنوان URL النسبي إلى مُنشئ كائن الصفحة.تحتوي جميع عناصر الصفحة على مُعدِّل وصول عام ، لذا يمكنك كتابة الاختبارات في كل من الأنماط الحتمية والإعلانية. أيضًا ، من العناصر ، يمكنك الحصول على البيانات اللازمة ، مثل النص أو بعض السمات.يتم تخزين محدد الموقع في مكان واحد فقط. يجب وصف كل منطق الصفحة في طرق الصفحة.باستخدام هذا النهج ، إذا انكسر شيء ما أو تغير ، في معظم الحالات ليس من الضروري إعادة كتابة الاختبارات ، يتم الانتهاء من الطريقة للتو أو يتغير محدد الموقع إلى الاختبار الفعلي.
package app.pages;
import com.codeborne.selenide.SelenideElement;
import helpers.Driver;
import static com.codeborne.selenide.Selenide.*;
public class LoginPage extends BasePage {
public SelenideElement loginField = $("#login__username");
public SelenideElement passwordField = $("#login__password");
public SelenideElement signInButton = $("#login_enter");
public SelenideElement termsOfUseLabel = $("label[for=\"login_agree\"]");
public LoginPage(String pageUrl) {
super(pageUrl);
}
public void login(String email, String password) {
loginField.setValue(email);
passwordField.setValue(password);
termsOfUseLabel.click();
signInButton.click();
Driver.waitForUrlContains("account/accounts");
}
}
راحة
تحتوي وحدة المساعدون على فئتينمهمتين : TestConfig - من هذا الفصل ، يمكنك الحصول على الإعدادات التي يتم تشغيل الاختبارات بها. الإعدادات الافتراضية معروضة هنا أيضًا.يتم تشغيل الاختبارات بواسطة الأمر. mvn test -Dbrowser=chrome -Dheadless=1
يتم أخذ قيم المتغيرات من سطر الأوامر ، وبفضل فئة TestConfig ، تتوفر في الاختبارات وفي التطبيق.على سبيل المثال ، يمكنك تغيير عنوان URL الخاص بالتطبيق وفقًا للبيئة (dev ، stage ، production).
package helpers;
public class TestConfig {
public static String browser = "chrome";
public static String headless = "1";
public static void initConfig() {
browser = System.getProperty("browser") == null ? "chrome" : System.getProperty("browser");
headless = System.getProperty("headless") == null ? "1" : System.getProperty("headless");
}
public static boolean isHeadless() {
return headless.contains("1");
}
}
إن فئة Driver هي الغلاف الخاص بي حول السائقين للسيلينيوم والسيلينايد مع بعض الطرق المفيدة.أهم الطرق:Driver.initDriver () - هنا تتم تهيئة برنامج التشغيل / المتصفح. public static void initDriver() {
TestConfig.initConfig();
Configuration.pageLoadStrategy = "eager";
Configuration.browserSize = "1920x1080";
Configuration.holdBrowserOpen = false;
Configuration.screenshots = false;
if(TestConfig.isHeadless()) {
Configuration.headless = true;
} else {
Configuration.headless = false;
}
switch (TestConfig.browser) {
case "chrome":
Configuration.browser = Browsers.CHROME;
break;
case "firefox":
Configuration.browser = Browsers.FIREFOX;
break;
default:
Configuration.browser = Browsers.CHROME;
break;
}
}
Driver.clearCookies()
Driver.close()
الاختبارات
جميع فئات الاختبار موروثة من فئة A_BaseTest ، حيث يتم إنشاء كائن تطبيق التطبيق ، ومسجل ، و softAssert ، ويفتح المتصفح ويغلق ، ويتم مسح ملفات تعريف الارتباط بعد كل اختبار.يوجد أيضًا A_BaseTestListener حيث يمكن تسجيل الأخطاء.تبدو الاختبارات شيء من هذا القبيل. سهلة القراءة وسهلة الصيانة.import org.testng.annotations.Test;
public class ExampleTest extends A_BaseTest
{
@Test
public void loginViaEmail() {
app.loginPage.open();
app.loginPage.login("email@email.com", "passwords");
logger.info("Sample info message");
softAssert.assertEquals(2,2);
softAssert.assertAll();
}
}
فئات الاختبار محددة في testng.xml .يحتوي مجلد اختبار الإخراج على سجلات ولقطات شاشة - Driver.takeScreenshot () .بالنسبة للتقارير ، يتم استخدام Allure . بعد اكتمال الاختبارات ، يمكنك تشغيل الأمر allure serve target/allure-results
ورؤية التقرير.مشروع جيثب - SelenideBoilerplate