נעשה קצת הפסקה מסלניום ובדיקות על קליינט אבל עדיין נשאר בתחום האוטומציה. בפוסט זה אדבר קצת על בדיקות צד שרת עם API.
ה-API איתו נעבוד נקרא JavaMail והבנת בסיס העבודה עימו תיתן לנו הבודקים יכולות בדיקה גבוהות מאוד החל מבדיקות פשוטות של קבלת דואר, דרך בדיקת קיום ספאם מייל, עד בדיקת פונקציונליות "עדינות" של האם המייל נקרא או לא.
כמו שציינתי, פוסט זה (למרבה ההפתעה) אינו מדבר על בדיקות אוטומציה עם סלניום, שהוא כידוע כלי בדיקות על ה-GUI (אלמנטים) של האפליקציה , אלא כאן אנו נבדוק המוצר שלנו (שרת דואר) ברמת ה-API שלו.
כיום כמעט כל שירותי הדואר הקיימים עובדים עם פרוטוקול שנקרא: IMAP , כך שניתן לומר כי אם ניקח למשל ספק דואר כדוגמת ג'ימייל הוא למעשה מממש את ה- JavaMail API תוך שימוש בפרוטוקול IMAP .
ה-JavaMail API מכיל בתוכו את המחלקות הבאות:
* מחלקת Message : מייצגת הודעות דואר אלקטרוני
* מחלקת Store: מייצגת מבנה נתונים של הודעות המנוהלות על ידי שרת הדואר ומאוגדות על ידי המשתמש (כתובת דוא"ל)
* מחלקת Folder: מספקת מבנה הירארכי של ההודעות שלנו , מחלקה זו מכילה הודעות (messages) וספריות (folders), שרת הדואר מקצה לכל משתמש ספריית ברירת מחדל וכל משתמש יכול ליצור לעצמו תתי ספריות
* מחלקת Transport: מייצגת פרוטוקול להעברת מידע ספציפי, אובייקט משתמש בפרוטוקול זה בשביל להעביר את ההודעה
בהמשך נראה דוגמא כיצד אנו משתמשים במחלקות אלו לכניסה לשרת דואר ובדיקות עליו.
אך לפני כן, נראה כיצד מטמיעים את ה-API אל תוך הסביבה שלנו.
אז תחילה ניצור פרוייקט חדש ב-Eclipse, נקרא לו JavaMailAPI ובתוכו נקים מחלקה חדשה בשם MailServerTest.
בשביל להוריד את קבצי ה-API (קבצי JAR) נכנס לכתובת הבאה (של ORACLE) :
http://www.oracle.com/technetwork/java/javamail/index.html
משם נקיש על כפתור ה-Download ונבחר את הגרסה העדכנית ביותר.
נוריד ונפתח את קובץ ה-ZIP.
בפרוייקט שלנו נשייך את קובץ mail.jar וכן את כל הקבצים היושבים תחת ספריית lib.
כעת נתחיל לקודד…
תחילה נגדיר אובייקט properties אותו נקרא אח"כ למחלקת ה-Session:
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
אל ה-Store נקבע את פרטי ההתחברות עם שם השרת, כתובת המייל והססמא כמובן:
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore("imaps");
store.connect("<MAIL SERVER>", "<EMAIL ADDRESS>", "<PASSWORD>");
וגם נגדיר אובייקט Folder שיעבוד מול ה-inbox שלנו:
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
למטרת הבדיקות ניצור מערך של Message אליו נכניס את כל ההודעות הקיימות ב-Inbox , משתנה Message שיחזיר את ההודעה הנוכחית ומשתנה נוסף בוליאני שיחזיק לי מידע האם ההודעה קיימת בתיבת הדואר הנכנס או לא.
Message[] messages = null;
boolean isMailFound = false;
Message mailSubject= null;
המערכת הנבדקת:
נשלח למשל מייל עם הכותרת: JavaMail API והטקסט בגוף ההודעה:
hello, this is a test from : admin@yoniflenner.net
שימו לב כי ההודעה נמצאת תחת הסטטוס של "הודעה לא נקראה" , חשוב לציין זאת כי נכתוב כעת קוד שבודק את הסטטוס הזה (בין היתר).
בשורה של ה-store.connect נכניס את הערכים הבאים: שם שרת הדואר, כתובת המייל וסיסמא
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.Properties; import javax.mail.Flags; import javax.mail.Folder; import javax.mail.Message; import javax.mail.Session; import javax.mail.Store; import javax.mail.search.SubjectTerm; public class emailConfirmation { public static void main(String[] args) throws Exception { String sSubject = "JavaMail API"; Properties props = System.getProperties(); props.setProperty("mail.store.protocol", "imaps"); Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("imaps"); store.connect("<MAIL SERVER>", "<EMAIL ADDRESS>", "<PASSWORD>"); Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_WRITE); System.out.println("Total Messages:" + folder.getMessageCount()); System.out.println("Number of unread messages:" + folder.getUnreadMessageCount()); Message[] messages = null; boolean isMailFound = false; Message mailSubject= null; //Search for mail from subject for (int i = 0; i < folder.getMessageCount(); i++) { messages = folder.search(new SubjectTerm(sSubject), folder.getMessages()); } if (messages.length != 0) System.out.println(sSubject + " Message Was found"); else System.out.println(sSubject + " Message Was NOT found"); //Search for unread mail from subject: JavaMail API { if (!mail.isSet(Flags.Flag.SEEN)) { mailSubject = mail; isMailFound = true; } } //Test fails if no unread mail was found with subject if (!isMailFound) System.out.println("No Unread Mail with subject: " + sSubject + " was found"); //Read the content of mail and launch registration URL else { String line; StringBuffer buffer = new StringBuffer(); BufferedReader reader = new BufferedReader(new InputStreamReader(mailSubject.getInputStream())); while ((line = reader.readLine()) != null) { buffer.append(line); } System.out.println("EMail Full Content: " + buffer); //Your logic to split the message and get the Registration URL goes here String registrationURL = buffer.toString().split("charset=UTF-8")[1].split(" --=_")[0]; System.out.println("Email Text Content: " + registrationURL); } } }
התוצאה של תוכנית זו:
Total Messages:16
Number of unread messages:1
Message Was found
EMail Full Content: –=_6f10154fded87683e512f5f7fce35020Content-Transfer-Encoding: 7bitContent-Type: text/plain; charset=UTF-8 hello, this is a test from : admin@yoniflenner.net –=_6f10154fded87683e512f5f7fce35020Content-Transfer-Encoding: quoted-printableContent-Type: text/html; charset=UTF-8<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"><html><body style=3D'font-family: Arial,Helvetica,sans-serif'><p>hello,</p><p>this is a test from : admin@yoniflenner.net</p></body></html>–=_6f10154fded87683e512f5f7fce35020–
Email Text Content: hello, this is a test from : admin@yoniflenner.net
ההודעה מאחורי – EMailFull Content נראית כמו זבל, זה בגלל שהוא לוקח את הודעת המייל במלואה הכוללת גם את ה-Header של ההודעה עם כל הפרמטרים שלו
שימו לב כי בשורה הבאה העפתי את כל התוספות של ההודעה והשארתי את התוכן בלבד, כך שיראה קריא. השתמשתי פה בפונקציית split כפי שניתן לראות בקוד.
כעת נסמן את ההודעה עם הנושא: JavaMail API כהודעה שנקראה ונריץ שוב את התוכנית, הפעם התוצאה שתהיה לנו תראה כך:
Total Messages:16
Number of unread messages:0
JavaMail API Message Was found
No Unread Mail with subject: JavaMail API was found
לקריאה נוספת אודות JavaMail API היכנסו לכאן:http://www.oracle.com/technetwork/java/javamail-1-149769.pdf