一种方法仅在运行所有测试但单独测试时通过时进行单位测试失败?

发布于 2025-01-27 21:39:07 字数 4498 浏览 0 评论 0原文

我是大学学习应用程序的第一年,我们的任务是进行简单的注册并登录系统。 目前唯一的问题是,当我在VSCODE上使用运行测试功能一次运行时,单元测试不起作用。 错误是

java.lang.AssertionError
 at st10035771.LoginTest.testIsValidPasswordF(LoginTest.java:35)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
 at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
 at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
 at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
 at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
 at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
 at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
 at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)

login.java:logintest.java,

    package st10035771;


import java.util.Scanner;

public class Login {
    public final static int USERNAME_LIMIT = 5;
    public final static int PASSWORD_LENGTH = 8;
     

    public static boolean checkUserName(String username) {
        return username.length() <= USERNAME_LIMIT && username.contains("_");

    }
/*
 * code attribute
 * this code was adapted from DelftStack
 * https://www.delftstack.com/howto/java/password-checker-java/
 */
    public static boolean checkPasswordComplexity(String password) {
      boolean isValidPassword;
      final int minUppers = 1;
      final int minDigits = 1;
      final int minSpecials = 1;
      int uppers = 0;
      int digits = 0;
      int specials = 0;

        for (int i = 0; i < password.length(); i++) {
            char ch = password.charAt(i);
            if (Character.isUpperCase(ch))
                uppers++;
            else if (Character.isDigit(ch))
                digits++;
            //if (ch >= 33 && ch <= 47 || ch == 64) {
              if (!Character.isLetterOrDigit(ch)) {
                specials++;
            }

        }

        if (password.length() >= PASSWORD_LENGTH && uppers >= minUppers && digits >= minDigits
                && specials >= minSpecials) {

            return isValidPassword = true;
        } else {
            return isValidPassword = false;
        }

    }
    public static void inputUser(){
        System.out.println("Please enter username:");
         Scanner un = new Scanner(System.in);
            String userName = un.next();

            if (checkUserName(userName)) {
                System.out.println("Username successfully captured");
            } else {
                System.out.println(
                        "Username is not correctly formatted, please ensure that your username contains an underscore and is no more than 5 characters in length.");
            }
    }

    

    public static void inputPass(){
        System.out.println("Please enter password:");
         Scanner pa = new Scanner(System.in);
            String userPass = pa.next();

            if (checkPasswordComplexity(userPass)) {
                System.out.println("Password successfully captured");
            } else {
                System.out.println(
                        "Password is not correctly formatted, please ensure that the password contains at least 8 characters, a capital letter, a number and a special character.");
            }
        
    }

    
}

一次

package st10035771;

import org.junit.Test;
import static org.junit.Assert.*;

public class LoginTest {

    public LoginTest() {
    }

    Login loginTest = new Login();

    @Test
    public void testSomeMethod() {

    }

    @Test
    public void testCheckUserName() {
        assertTrue(loginTest.checkUserName("kyl_1"));
    }

    @Test
    public void testCheckUserNameF() {
        assertFalse(loginTest.checkUserName("kyle!!!!!!!"));
    }

    @Test
    public void testIsValidPassword() {
        assertTrue(loginTest.checkPasswordComplexity("Ch&&sec@ke99!"));
    }

    @Test
    public void testIsValidPasswordF() {
        assertFalse(loginTest.checkPasswordComplexity("password"));
    }

}

一次测试时唯一失败的是testisvalidpasswordf

I am a first year at college studying application dev and our assignment is to make a simple registration and log in system.
The only problem right now is that the unit testing doesn't work when I run them all at once with the Run Tests feature on VSCode.
the error is this

java.lang.AssertionError
 at st10035771.LoginTest.testIsValidPasswordF(LoginTest.java:35)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
 at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
 at java.base/java.util.Iterator.forEachRemaining(Iterator.java:133)
 at java.base/java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
 at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
 at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
 at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
 at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
 at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
 at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)

Login.java:

    package st10035771;


import java.util.Scanner;

public class Login {
    public final static int USERNAME_LIMIT = 5;
    public final static int PASSWORD_LENGTH = 8;
     

    public static boolean checkUserName(String username) {
        return username.length() <= USERNAME_LIMIT && username.contains("_");

    }
/*
 * code attribute
 * this code was adapted from DelftStack
 * https://www.delftstack.com/howto/java/password-checker-java/
 */
    public static boolean checkPasswordComplexity(String password) {
      boolean isValidPassword;
      final int minUppers = 1;
      final int minDigits = 1;
      final int minSpecials = 1;
      int uppers = 0;
      int digits = 0;
      int specials = 0;

        for (int i = 0; i < password.length(); i++) {
            char ch = password.charAt(i);
            if (Character.isUpperCase(ch))
                uppers++;
            else if (Character.isDigit(ch))
                digits++;
            //if (ch >= 33 && ch <= 47 || ch == 64) {
              if (!Character.isLetterOrDigit(ch)) {
                specials++;
            }

        }

        if (password.length() >= PASSWORD_LENGTH && uppers >= minUppers && digits >= minDigits
                && specials >= minSpecials) {

            return isValidPassword = true;
        } else {
            return isValidPassword = false;
        }

    }
    public static void inputUser(){
        System.out.println("Please enter username:");
         Scanner un = new Scanner(System.in);
            String userName = un.next();

            if (checkUserName(userName)) {
                System.out.println("Username successfully captured");
            } else {
                System.out.println(
                        "Username is not correctly formatted, please ensure that your username contains an underscore and is no more than 5 characters in length.");
            }
    }

    

    public static void inputPass(){
        System.out.println("Please enter password:");
         Scanner pa = new Scanner(System.in);
            String userPass = pa.next();

            if (checkPasswordComplexity(userPass)) {
                System.out.println("Password successfully captured");
            } else {
                System.out.println(
                        "Password is not correctly formatted, please ensure that the password contains at least 8 characters, a capital letter, a number and a special character.");
            }
        
    }

    
}

LoginTest.java

package st10035771;

import org.junit.Test;
import static org.junit.Assert.*;

public class LoginTest {

    public LoginTest() {
    }

    Login loginTest = new Login();

    @Test
    public void testSomeMethod() {

    }

    @Test
    public void testCheckUserName() {
        assertTrue(loginTest.checkUserName("kyl_1"));
    }

    @Test
    public void testCheckUserNameF() {
        assertFalse(loginTest.checkUserName("kyle!!!!!!!"));
    }

    @Test
    public void testIsValidPassword() {
        assertTrue(loginTest.checkPasswordComplexity("Ch&&sec@ke99!"));
    }

    @Test
    public void testIsValidPasswordF() {
        assertFalse(loginTest.checkPasswordComplexity("password"));
    }

}

The only one that fails when tested all at once is the TestIsValidPasswordF

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

絕版丫頭 2025-02-03 21:39:07

主要问题是您的鞋帮 /数字 /特殊计数在检查密码后永远不会将其设置为零。因此,当您运行所有测试并到达testisvalidpasswordf时,我会假设testisvalidpassword首先运行,并且您已经在这些计数中的数字大于1。

当您自行运行测试时,计数开始为0,这就是为什么它通过的原因。

将这些计数移至checkpasswordcomplexity方法的开始。

Main issue is your uppers / digits / specials counts are never set back to zero after checking a password. So when you run all tests and it gets to testIsValidPasswordF I would assume testIsValidPassword has ran first and you already have a number greater than 1 in these counts.

When you run a test on its own the counts start as 0 which is why it passes.

Moving these counts to the start of the checkPasswordComplexity method should fix it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文