הקדמה
במאמר זה, אסקור יכולת לדלג אוטומטית על מקרי בדיקה נכשלים, המבוססת על שימוש ב-reflection לאנוטציות. המערך הטכנולוגי ששימש למימוש הפתרון הוא:
שפת תכנות: Java
כלי בנייה: Maven
סביבת בדיקות: TestNG
סביבת דיווח: Allure
הבעיה
עומדות בפנינו שתי בעיות. הראשונה היא כיצד לציין שלבדיקה יש בעיות - בעיות ידועות באוטומציה או במוצר שגורמות לבדיקה להיכשל בכל פעם.
הבעיה הראשונה נפתרת על ידי Allure, המספקת אנוטציה בשם Issues
עבור מספר פגמים ואנוטציה בשם Issue
לסימון פגם בודד.
זהו מימוש הקוד של מתודת בדיקה המכילה בעיות:
@Issues({
@Issue("AUTO-50"),
@Issue("AUTO-60")
})
@Test(description = "Response time assertion")
public void responseTimeAssertion() {
// some test code
}
הבעיה השנייה שבה עוסק מאמר זה - כיצד אוכל לדלג על מקרי בדיקה נכשלים אלה? זאת למקרה שצוות האוטומציה שלנו רוצה שהדוח יציין רק את מקרי הבדיקה שעברו בהצלחה.
הפתרון – דילוג על מקרי בדיקה בהתבסס על אנוטציית ה-Issues
מהי רפלקציה (reflection)
לפי אורקל:
רפלקציה היא תכונה בשפת התכנות Java. היא מאפשרת לתוכנית Java רצה לבחון או “להתבונן פנימה” על עצמה, ולתפעל מאפיינים פנימיים של התוכנית. לדוגמה, אפשרי עבור מחלקת Java לקבל את שמות כל חבריה ולהציגם.
הפתרון שלנו משתמש ברפלקציה מכיוון שהוא בוחן את נוכחות וערכי האנוטציה של מתודת הבדיקה בזמן ריצה.
מימוש הפתרון
מימשנו test listener שבודק לפני כל בדיקה את התנאים הבאים:
- המתודה אינה null – למקרה שמתודת הבדיקה אינה מכילה דבר.
- המתודה מכילה את האנוטציה “Issues”.
- אנוטציית ה-”Issues” מכילה בעיות - היא לא אמורה להיות מערך ריק.
במקרה שחלק / כל התנאים הללו אינם מתקיימים:
אנו מריצים את מתודת הבדיקה כרגיל.
במקרה שכל התנאים מתקיימים:
- אנו יוצרים רשימת מערך (array list) חדשה המכילה את ערכי הבעיות.
- אנו זורקים חריגת דילוג של TestNG (TestNG skip exception) הגורמת לדילוג על מתודת הבדיקה, ומציינים את ערכי הבעיות מתוך רשימת הבעיות למפתח האוטומציה שמריץ את הבדיקות הללו.
זהו מימוש הקוד של מחלקת ה-test listener:
public class ListenerClass extends TestListenerAdapter {
@Override
public void onTestStart(ITestResult result) {
Method method = result.getMethod().getConstructorOrMethod().getMethod();
if (method != null && method.isAnnotationPresent(Issues.class) &&
!Arrays.asList(method.getAnnotation(Issues.class).value()).isEmpty()) {
ArrayList<String> issues = new ArrayList<>();
Arrays.asList(method.getAnnotation(Issues.class).value()).forEach(issue ->
issues.add(issue.value()));
throw new SkipException(
String.format("Open Issues %s Skipping this test", issues));
}
}
}
תוצאת הריצה בדוח שנוצר היא:
מקרה הבדיקה דולג אוטומטית, והסיבה צוינה יחד עם ערכי הפגמים.
לסיכום
במאמר זה, סקרנו את הבעיה שבה רצינו לדלג על מקרי בדיקה נכשלים כדי לקצר את זמן הבדיקה ולשפר את אחוז מקרי הבדיקה העוברים. מימשנו פתרון לדילוג אוטומטי על מקרי בדיקה נכשלים בהתבסס על רפלקציה של אנוטציות מסביבת הדיווח שלנו.
בדיקות מהנות!