מיכל בדיקת דוקר בבדיקות ג'אווה

1. הקדמה

במדריך זה נבחן את Java טסט מיכלים סִפְרִיָה. זה מאפשר לנו להשתמש במכולות Docker במסגרת הבדיקות שלנו. כתוצאה מכך אנו יכולים לכתוב מבחני אינטגרציה עצמאיים התלויים במשאבים חיצוניים.

אנו יכולים להשתמש בכל משאב בבדיקות שלנו בעלות תמונת docker. לדוגמא, יש תמונות לבסיסי נתונים, דפדפני אינטרנט, שרתי אינטרנט ותורי הודעות. לכן אנו יכולים להריץ אותם כמכולות במסגרת הבדיקות שלנו.

2. דרישות

טסט מיכלים ניתן להשתמש בספרייה עם Java 8 ומעלה. חוץ מזה הוא תואם ל- JUnit Rules API.

ראשית, בואו נגדיר את התלות של maven לפונקציונליות הליבה:

 org.testcontainers testcontainers 1.11.4 

ישנם גם מודולים למיכלים מיוחדים. במדריך זה נשתמש PostgreSQL ו סֵלֶנִיוּם.

בואו נוסיף את התלות הרלוונטיות:

 org.testcontainers postgresql 1.11.4 org.testcontainers סלניום 1.11.4 

אנו יכולים למצוא את הגרסאות העדכניות ביותר ב- Maven Central.

כמו כן, אנו זקוקים ל- Docker להפעלת מכולות. עיין בתיעוד של Docker לקבלת הוראות התקנה.

ודא שאתה מסוגל להריץ מכולות Docker בסביבת הבדיקה שלך.

3. שימוש

בואו להגדיר כלל מיכל כללי:

@ClassRule סטטי ציבורי GenericContainer simpleWebServer = GenericContainer חדש ("אלפיני: 3.2") .withExposedPorts (80) .withCommand ("/ bin / sh", "-c", "בעוד נכון; לעשות הד" + "\" HTTP / 1.1 200 בסדר \ n \ n שלום עולם! \ "| Nc -l -p 80; גמור");

אנו בונים א GenericContainer כלל בדיקה על ידי ציון שם תמונת העגינה. לאחר מכן, אנו מגדירים את זה בשיטות בנייה:

  • אנו משתמשים עם ExportsPorts לחשוף נמל מהמיכל
  • withCommand מגדיר פקודת מיכל. זה יבוצע עם תחילת המכולה.

ההערה עם הכלל היא @ ClassRule. כתוצאה מכך, הוא יפעיל את מיכל ה- Docker לפני ביצוע בדיקה כלשהי במחלקה זו. המכולה תושמד לאחר ביצוע כל השיטות.

אם תגישו מועמדות @כְּלָל ביאור, GenericContainer כלל יתחיל מיכל חדש לכל שיטת בדיקה. וזה יעצור את המכולה כאשר שיטת בדיקה זו תסתיים.

אנו יכולים להשתמש בכתובת IP וביציאה כדי לתקשר עם התהליך שרץ במיכל:

@Test הציבור בטל givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () זורק חריג {כתובת מחרוזת = "//" + simpleWebServer.getContainerIpAddress () + ":" + simpleWebServer.getMappedPort (80); תגובת מחרוזת = simpleGetRequest (כתובת); assertEquals (תגובה, "שלום עולם!"); }

4. מצבי שימוש

יש כמה מצבי שימוש של מיכלי הבדיקה. ראינו דוגמה להפעלת a GenericContainer.

טסט מיכלים לספרייה יש גם הגדרות כלל עם פונקציונליות מיוחדת. הם מיועדים למכולות של מאגרי מידע נפוצים כמו MySQL, PostgreSQL; ואחרים כמו לקוחות אינטרנט.

למרות שאנחנו יכולים להריץ אותם כמכולות כלליות, ההתמחויות מספקות שיטות נוחות מורחבות.

4.1. מאגרי מידע

נניח שאנחנו זקוקים לשרת מסד נתונים לבדיקות אינטגרציה של שכבת גישה-נתונים. אנו יכולים להריץ מסדי נתונים במכולות בעזרת ספריית TestContainers.

לדוגמה, אנו מפעילים מיכל PostgreSQL עם PostgreSQLContainer כְּלָל. לאחר מכן אנו יכולים להשתמש בשיטות עוזרות. אלו הם getJdbcUrl, getUsername, getPassword לחיבור מסד נתונים:

@ כלל ציבורי PostgreSQLContainer postgresContainer = חדש PostgreSQLContainer (); @ מבחן ציבורי בטל כאשר SelectQueryExecuted_thenResulstsReturned () זורק חריג {String jdbcUrl = postgresContainer.getJdbcUrl (); שם משתמש מחרוזת = postgresContainer.getUsername (); סיסמת מחרוזת = postgresContainer.getPassword (); חיבור conn = DriverManager .getConnection (jdbcUrl, שם משתמש, סיסמה); ResultSet resultSet = conn.createStatement (). ExecuteQuery ("בחר 1"); resultSet.next (); int result = resultSet.getInt (1); assertEquals (1, תוצאה); }

אפשר גם להפעיל את PostgreSQL כמכולה כללית. אבל יהיה קשה יותר להגדיר את החיבור.

4.2. מנהלי רשת

תרחיש שימושי נוסף הוא הפעלת מכולות עם דפדפני אינטרנט. BrowserWebDriverContainer כלל מאפשר ריצה כרום ו פיירפוקס ב דוקר-סלניום מכולות. ואז, אנחנו מנהלים אותם באמצעות RemoteWebDriver.

זה מאוד שימושי לאוטומציה של בדיקות ממשק משתמש / קבלה ליישומי אינטרנט:

@ כלל BrowserWebDriverContainer chrome = BrowserWebDriverContainer חדש (). WithCapabilities (ChromeOptions חדשים ()); @ מבחן ציבורי בטל כאשר NavigatedToPage_thenHeadingIsInThePage () {DriverWebDriver driver = chrome.getWebDriver (); driver.get ("// example.com"); כותרת מחרוזת = driver.findElement (By.xpath ("/ html / body / div / h1")) .getText (); assertEquals ("כותרת דוגמה", כותרת); }

4.3. Docker Compose

אם המבחנים דורשים שירותים מורכבים יותר, אנו יכולים לציין אותם ב- docker-compose קוֹבֶץ:

simpleWebServer: image: alpine: 3.2 פקודה: ["/ bin / sh", "-c", "בעוד נכון; לעשות הד 'HTTP / 1.1 200 אישור \ n \ n שלום עולם!' | nc -l -p 80; נעשה "]

ואז, אנו משתמשים DockerComposeContainer כְּלָל. כלל זה יפעיל ויפעיל שירותים כהגדרתם בקובץ ההלחנה.

אנו משתמשים getServiceHost ו getServicePost שיטות לבניית כתובת חיבור לשירות:

@ClassRule DockerComposeContainer compose סטטי ציבורי = DockerComposeContainer חדש (קובץ חדש ("src / test / resources / test-compose.yml")). WithExposedService ("simpleWebServer_1", 80); @Test הציבור בטל givenSimpleWebServerContainer_whenGetReuqest_thenReturnsResponse () זורק חריג {כתובת מחרוזת = "//" + compose.getServiceHost ("simpleWebServer_1", 80) + ":" + compose.getServicePort ("simpleWebServer_1", 80); תגובת מחרוזת = simpleGetRequest (כתובת); assertEquals (תגובה, "שלום עולם"); }

5. מסקנה

ראינו כיצד נוכל להשתמש טסט מיכלים סִפְרִיָה. זה מקל על פיתוח והפעלת מבחני אינטגרציה.

השתמשנו GenericContainer כלל עבור מכולות של תמונות העגינה הנתונות. ואז, הסתכלנו PostgreSQLContainer, BrowserWebDriverContainer ו DockerComposeContainer כללים. הם נותנים פונקציונליות רבה יותר למקרי שימוש ספציפיים.

לבסוף, ניתן למצוא דוגמאות קוד כאן ב- GitHub.