【问题标题】:test cases for reversing a string反转字符串的测试用例
【发布时间】:2014-03-13 03:55:41
【问题描述】:

我正在尝试练习 QA 面试,我想处理我能想到的尽可能多的测试用例。我相信我的方法适用于所有情况,除非输入为 null 我不确定如何处理该异常。编译器会在代码运行之前先给我一个错误。所以我不确定如何处理该异常。我四处阅读,不推荐catching NullPointerException。我将如何处理null 输入。另外,如果其他人能想到其他测试用例,我很乐意测试并看看它!

这是我的测试用例:

""
"abcdef"
"abbbba"
null

不太清楚如何处理

转义字符

"\n"  --> "n\"
"\t"  --> "t\"

特殊字符,如

áe  -->  eá 

代码:

public static String reverseStr(String str) {
    int len = str.length();
    if (len <= 0) {
        return "Empty String";
    }
    char[] strArr = new char[len];
    int count = 0;
    for (int i = len - 1; i >= 0; i--) {
        strArr[count] = str.charAt(i);
        count++;
    }
    return new String(strArr);
}

经过进一步的建议,这里是更新的代码:

public static String reverseStr(String str) {
    if ( str == null ) {
          return null;
    }
    int len = str.length();
    if (len <= 0) {
        return "";
    }
    char[] strArr = new char[len];
    int count = 0;
    for (int i = len - 1; i >= 0; i--) {
        strArr[count] = str.charAt(i);
        count++;
    }
    return new String(strArr);
}

【问题讨论】:

  • 我看到了审查您的测试用例的请求,但我看到的只是一个实现。我错过了什么吗?
  • 很难想出其他可能破坏字符串反转算法的测试用例。我唯一会考虑的是字符串是否比整数的最大值长,但这显然在 Java 中不会发生。
  • @Liondancer 你已经逐个字符地处理了字符串,除了它实际上是通过组合字符而带有重音的 unicode,现在你已经反转了它,重音在错误的字符上。 stackoverflow.com/q/7476535/478656 还有inkling.com/read/programming-perl-christiansen-4th/chapter-6/…joelonsoftware.com/articles/Unicode.html
  • @Liondancer 我什至不确定Unicode字符串是否可行,有太多的情况,有些事情颠倒是没有意义的,一些单一的模式可能会以多种方式颠倒,具体取决于它们是什么人类语言在(我找不到我正在寻找的关于它的好文章)。这在简短的采访风格功能中肯定是不可能的。我提到它是因为面试 QA 工作,谈论字符串,说“我认为这适用于每种情况”而不考虑 Unicode,似乎很糟糕。至少将其作为函数无法/无法处理的内容提及。
  • 测试用例:null"""x",以及一堆随机生成的任意长度> 1的字符串。

标签: java string testing


【解决方案1】:

如果 string 为 null,编译器不会给你一个错误,但是当你运行代码时你会得到一个 NullPointerException。您的 reverseStr 方法可以检查

if ( str == null ) {
  return "null string passed in";
}

或者你可以做类似的事情

int len = (str != null) ? str.length() : 0

现在 null 和空字符串的长度都为 0。这取决于您是否要区别对待 null 和空。

【讨论】:

  • 对,OP 应该使用空字符串执行任何适合其输入的操作。
【解决方案2】:

对于 null 情况,您可以先添加简单测试 if(str==null) throw new IllegalArgumentException("arg must be not null"),然后将 throws IllegalArgumentException 添加到声明中。

【讨论】:

  • 感谢您对 Stack Overflow 的贡献。我进行了一些编辑以提高可读性。 :)
【解决方案3】:

您应该在方法中做的第一件事是检查无效性:

public static String reverseStr(String str) {
    if(str==null){
        return null;
    }
    else{
       //the rest of your code goes here
    }
}

【讨论】:

  • 好吧,只是想告诉输入为空。现在应该更好
【解决方案4】:

如果字符串为空,我不明白您为什么返回 "Empty String"。这意味着输入字符串是"gnirtS ytpmE"

如果字符串为空,则应返回空字符串。如果字符串是null,您可能应该返回null(或抛出异常)。

if (str == null) return null;
int len = str.length();
if (len == 0) return "";

【讨论】:

    【解决方案5】:

    NPE(NullPointerException) 来自于访问参数“str”时为空。如果将参数替换为 'null' 是有意义的,所以它看起来像这样: int len = null.length();这没有多大意义。 '||' or 运算符不同于“|” or 运算符,如果第一个元素为真,则不计算另一个操作数,因为可以确定整个结果。在这种情况下利用这一点可以让您安全地调用 str.isEmpty(),因为它保证不会为空。

    public static String reverseStr(String str) {
        if(null == str || str.isEmpty()){
            return "Empty String";
        }
        int len = str.length();
    
        char[] strArr = new char[len];
        int count = 0;
        for (int i = len - 1; i >= 0; i--) {
            strArr[count] = str.charAt(i);
            count++;
        }
        return new String(strArr);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-04
      • 2020-06-28
      • 1970-01-01
      • 2016-01-06
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多