package Pflichtuebung_4; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; import java.util.Random; public class Test_Passwords_Oliver_S { Random random = new Random(); //Mindestanforderungen an das Passwort final static int MIN_LENGTH = 20; final static int MIN_KLEINBUCHSTABEN = 3; final static int MIN_GROSSBUCHSTABEN = 3; final static int MIN_ZIFFERN = 3; final static int MIN_SONDERZEICHEN = 3; final static int TEST_RUNS = 1000000; //Wie häufig die Tests wiederholt werden sollen final static int MAX_GEN_PASSWORD_LENGTH = 100; //Wie lang das roh generierte Passwort sein sollte (ohne enthaltene Testcases). final static int MAX_EXTRA_CHARACTERS = 10; //Wie viele Extra Zeichen in das Passwort für den Testcase (More than min) eingefügt werden sollen. //Spezifiziert die Bereiche in denen verschiedene Arten von Zeichen liegen. final static int START_CHAR_ALL = 32; final static int STOP_CHAR_ALL = 126; final static int START_CHAR_ZIFFERN = 48; final static int STOP_CHAR_ZIFFERN = 57; final static int START_CHAR_KEINB = 97; final static int STOP_CHAR_KLEINB = 122; final static int START_CHAR_GROSSB = 65; final static int STOP_CHAR_GROSSB = 90; final static int START_CHAR_SONDERZ_1 = 32; final static int STOP_CHAR_SONDERZ_1 = 47; final static int START_CHAR_SONDERZ_2 = 58; final static int STOP_CHAR_SONDERZ_2 = 64; final static int START_CHAR_SONDERZ_3 = 91; final static int STOP_CHAR_SONDERZ_3 = 96; final static int START_CHAR_SONDERZ_4 = 123; final static int STOP_CHAR_SONDERZ_4 = 127; @FunctionalInterface interface Check_X_Interface{ boolean X_Method(String password); } //Generiert einen zufälligen String mit der Länge "length", mit den Zeichen zwischen "start_char" und "stop_char" und exkluidert ggf. den Bereich von "start_exclude" bis "stop_exclude" String generateRandomString(int length,int start_char, int stop_char, int start_exclude, int stop_exclude){ StringBuilder text = new StringBuilder(length); int i = 0; while(i < length){ int random_int_in_range = random.nextInt(start_char,stop_char+1); if(start_exclude <= random_int_in_range && random_int_in_range <= stop_exclude){ i--; } else{ text.append((char)random_int_in_range); } i++; } return text.toString(); } //Spezielle Mehtode, die einen String ohne Sonderzeichen erzeugt. String generateRandomStringWithOutSonderZeichen(int length){ StringBuilder text = new StringBuilder(length); int i = 0; while(i < length){ int random_int_in_range = random.nextInt(START_CHAR_ALL,STOP_CHAR_ALL+1); if((START_CHAR_SONDERZ_1 <= random_int_in_range && random_int_in_range <= STOP_CHAR_SONDERZ_1)|| (START_CHAR_SONDERZ_2 <= random_int_in_range && random_int_in_range <= STOP_CHAR_SONDERZ_2)|| (START_CHAR_SONDERZ_3 <= random_int_in_range && random_int_in_range <= STOP_CHAR_SONDERZ_3)|| (START_CHAR_SONDERZ_4 <= random_int_in_range && random_int_in_range <= STOP_CHAR_SONDERZ_4)){ i--; } else{ text.append((char)random_int_in_range); } i++; } return text.toString(); } char getRandomSonderzeichen(){ int random_sonderzeichen_region = random.nextInt(0,4); //Because we have 4 Sonderzeichen Areas in ASCII... int start_region; int end_region; if(random_sonderzeichen_region == 0){ start_region = START_CHAR_SONDERZ_1; end_region = STOP_CHAR_SONDERZ_1; } else if(random_sonderzeichen_region == 1){ start_region = START_CHAR_SONDERZ_2; end_region = STOP_CHAR_SONDERZ_2; }else if(random_sonderzeichen_region == 2){ start_region = START_CHAR_SONDERZ_3; end_region = STOP_CHAR_SONDERZ_3; }else{ start_region = START_CHAR_SONDERZ_4; end_region = STOP_CHAR_SONDERZ_4; } int random_int_in_range = random.nextInt(start_region,end_region+1); return (char)random_int_in_range; } //Das Herzstück der Tests: //Es werden für jede zu testende Methode jeweils 3 Fälle abgefragt: //1. Anforderung an die Methode wird nicht erfüllt, z.B zu wenige Ziffern -> Methode sollte immer falsch liefern. //2. Anforderungen werden erfüllt, z.B genau 3 Ziffern -> Methode sollte immer wahr liefern. //3. Anforderung werden über erfüllt z.B mehr als 3 Ziffern -> Methode sollte immer wahr liefern. //Die Test Methoden sind sehr ähnlich aufgebaut und unterscheiden sich nur in der inneren for Schleife und dem assert am Ende. //Alle Zufälle finden in einem vordefinierten Breich statt um die Tests besser kontrollieren zu können. void test_checkX_with_less_than_Min_X(int start_char, int stop_char, int start_exclude_char, int stop_exclude_char, int min_X, Check_X_Interface password_check_interface){ for(int i=0; i Wird die Mehtode "checkZiffer" getestet enthält der String bis hier keine Ziffern! StringBuilder test_password_build = new StringBuilder(generateRandomString(random_password_length,start_char,stop_char,start_exclude_char,stop_exclude_char)); //System.out.println(test_password_build.toString()); //Ab hier wir es interessant. Je nach dem welcher Test läuft, wird eine zufälliges zu testendes Zeichen (z.B Ziffer) in den String, in einer zufälligen Position eingefügt. //Die Anzahl der Testzeichen liegt wie hier immer immer unter der Mindestanforderung für die zu testende Methode. -> Hier sollte immer false heraus kommen. for(int j=0; j Der Test ist dann fehlgeschlagen. } void test_checkX_with_exact_Min_X(int start_char, int stop_char, int start_exclude_char, int stop_exclude_char, int min_X, Check_X_Interface password_check_interface){ for(int i=0; i