Java assert

Java assert

ה-assert ב-Java הוא כלי רב-עוצמה המיועד לבדיקת תקינות לוגית במהלך פיתוח ובדיקות (Testing). הוא מאפשר למתכנת להגדיר תנאים שחייבים להתקיים בנקודה מסוימת בקוד, ואם התנאי אינו מתקיים, התוכנית תעצור ותזרוק AssertionError.

⚠️ שימו לב!

לפני הכל, assert אינו פועל בצורה אוטומטית ויש להפעילו! אין לבלבל בין assert לבין assertEquals שפועל בצורה אוטומטית.
איך נפעיל assert? נוסיף ב vm arguments את הערך ea- . ללא הערך הזה, assert לא יפעל ולא יוציא שגיאה במצב שבו אנו מצפים לשגיאה. ניתן להריץ את האפליקציה שלנו עם הפרמטר הזה על ידי הפקודה הבאה: java -ea appName

אין להשתמש ב assert כבדיקה בסביבת production. זה משמש אותנו המפתחים כבדיקה שלנו, בהרצת הקוד לפני שחרורו הסופי. אם נשאיר בקוד את הבדיקה וה vm arguments מוגדר, יכולה לעוף לנו שגיאת AssertionError בזמן ריצה.

דרכי שימוש

ישנן שתי דרכים להשתמש ב-assert:

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

public class BankAccount {
private double balance;
public void withdraw(double amount) {
assert amount > 0 : "positive amount: " + amount;
 balance -= amount;
 assert balance >= 0 : "balance under zero!";
}
 } 
  • אל תסמכו על assert ללוגיקה עסקית: מכיוון שניתן לכבות אותו, לעולם אל תשתמש בו כדי לאכוף חוקים קריטיים (כמו אבטחה או ניקוי נתונים).
  • השתמשו בו ככלי דיבאג: הוא מעולה לשלב הפיתוח והבדיקות (Unit Testing).
  • הודעות מפורטות: תמיד השתמשו בגרסה עם ההודעה (:"message"), זה חוסך שעות של ניחושים כשמתקבלת שגיאה.

ניתן לשלב assert ב-JUnit

בזמן הרצת טסטים, לעיתים נרצה לוודא מצב פנימי של אובייקט תוך כדי הריצה של ה-Test. כדי שה-assert יעבוד בטסטים שלך, עליך לוודא שה-VM של ה-Test מוגדר עם הדגל -ea.

שימו לב! במידה והVM הזה לא מופעל assertEquals יפעל כרגיל!
מאפיין תיאור
assertEquals org.junit.jupiter.api.Assertions.assertEquals - נועד לטסטים, וכל עוד יש לנו את הimport הנכון, הוא תמיד ירוץ.
assert (Java keyword) Keyword - נועד לבדיקת לוגיקה פנימית. הוא ירוץ רק אם ה-JVM הופעל עם ea-.

דוגמה לקוד המשלב assert ו assertEquals :

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

assertEquals(0, account.getBalance(), "balance should be zero 0");

השורה הזאת תפעל רק כשנריץ את ה vm arguments הנכון.

assert account.getBalance() >= 0 : "balance is zero!";

קוד מלא לדוגמה:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;

public class BankAccountTest {

    @Test
    void testWithdrawalLogic() {
        BankAccount account = new BankAccount();

        account.withdraw(100);
        assertEquals(0, account.getBalance(), "balance should be zero 0");


        assert account.getBalance() >= 0 : "balance is zero!";
    }
}
🏠 Back to Orly's Code Corner