Testy wpływają na siebie? Co skopałem?

0

Użytkownik podaje przy rejestracji lub zmianie hasło jakie by chciał mieć.
Hasło przechodzi przez różne etapy sprawdzające czy wolno mu takie hasło mieć.
Jeżeli nie przejdzie któregoś z etapów, to do listy dodawany jest błąd(z najprostszego możliwego enuma).
Każdy etap to klasa dziedzicząca po interfejsie z jedną metodą, i do każdego jest osobna klasa testów.

Dodawanie etapów:

public class PassphraseValidator{
    
    private List<ValidatePasswordStage> stageErrors=new ArrayList<>();
    
    private void stages(){
        stageErrors.add(new CheckLengthStage());
        stageErrors.add(new CheckRepetitionsStage());
//        **stageErrors.add(new CheckContainLoginStage());**
    }
    
    public Set<PassValidationErrors> validate(String pass, String nik, String prevPass) {
        stages();        
        Set<PassValidationErrors> result = new HashSet<>();

        for (ValidatePasswordStage stage : stageErrors) {
            stage.check(pass, nik, prevPass, result);
        }
        return result;
    }
}

Jeżeli sprawdzanie czy hasło zawiera login jest zakomentowane to 2 z 3 testów przechodzi(długość, powtórzenia), natomiast kiedy jest odkomentowane, to przechodzi tylko 1 z 3 testów(właśnie to sprawdzanie czy hasło zawiera login).
Wygląda to tak jakby ten test wpływał na inne, ale przecież nie może.
Co skopałem i jak to poprawić?

Sprawdzenie czy hasło zawiera login:

public class CheckContainLoginStage implements ValidatePasswordStage{

    @Override
    public void check(String pass, String login, String prevPass, Set<PassValidationErrors> results) {
        String nick;
        nick = login.substring(0, login.indexOf("@"));
        if(pass.indexOf(nick)!=-1){
            results.add(PassValidationErrors.pass_contains_nick);
        }
    }
}

Test do tego sprawdzenia:

public class CheckContainLoginStageNGTest {
    
    @Test
    public void isLoginInPassword(){
        String login="[email protected]",
               pass="smerfik",
               pass2="avogadro123456";
        PassphraseValidator passphrase=new PassphraseValidator();
        Set<PassValidationErrors> result;
        result=passphrase.validate(pass, login, "");
        Assert.assertFalse(result.contains(PassValidationErrors.pass_contains_nick)); 
        result=passphrase.validate(pass2, login, "");
        Assert.assertTrue(result.contains(PassValidationErrors.pass_contains_nick)); 
    }
}

Kod testujący długość:

public void check(String pass, String login, String prevPass, Set<PassValidationErrors> results) {
        if(pass.length()<MIN_LENGTH || pass.length()>MAX_LENGTH){
            results.add(PassValidationErrors.wrong_length);
        }
    }

Test do niego:

public void isLengthOk(){
        String toshort="ala11",
               correct="tojestdobrehasło",
               tolong="baaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
                    + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        PassphraseValidator passphrase=new PassphraseValidator();
        Set<PassValidationErrors> result;
        result=passphrase.validate(toshort, "", "");
        Assert.assertTrue(result.contains(PassValidationErrors.wrong_length)); 
        result=passphrase.validate(correct, "", "");
        Assert.assertFalse(result.contains(PassValidationErrors.wrong_length)); 
        result=passphrase.validate(tolong, "", "");
        Assert.assertTrue(result.contains(PassValidationErrors.wrong_length)); 
    }

Ja to chyba jestem "szczególnie uzdolniony", bo testy które są po to żeby ułatwiać życie są dla mnie kolejnym miejscem na popełnienie błędu.

0

TL; DR
ale na koncu wkladasz validatory do HashSetu, ktory nie gwarantuje zachowania kolejnosci (wrecz przeciwnie, prawie na bank bedzie inna). Jesli chcesz kolejnosc to moze LinkedHashSet?

0

Kolejność nie ma znaczenia, a poza tym nie powinna mieć żadnego wpływu na to.

@TL;DR
Jeżeli sprawdzam tylko długość i powtórzenia, a test zawartości loginu w haśle pomijam to 2 z 3 testów przechodzą, a jeżeli zawartość w loginu w haśle też sprawdzam, to już mi testy długości i powtórzeń mi nie przechodzą.

0

Zajrzałem do autputa i znalazłem takie coś: Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.10:test (default-test) on project HelloWorld: There are test failures. , ale to jest chyba równoważne z tym okienkiem testów pokazującym, że taki a taki test się nie powiódł.

Już kompletnie nie mam pomysłów czemu sprawdzanie zawartości loginu w haśle wpływa na wyniki testów pozostałych etapów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1