例如,我想验证该名称只是字母,长度在4到14个字母之间。我在模型中有以下代码:
validates: name, :format => { :with => /^[a-zA-Z]+$/,
:message => 'Name should be letters only. },
:length => { :minimum => 4, :maximum => 14 }
所以它显然让我做我想做的事 但至于单元测试,我有一点太完美主义,所以我设置了像
invalid_names = ['1234',
'qwe',
'1%#$#$',
'Sam1',
'%',
random_string(15)] #I also have a test method to create random string with parametrized length
valid_names = %w['test',
'Travis',
'John',
random_string(5),
random_string(14),
random_string(4)]
并使用断言(例如
)在循环中测试它们invalid_names.each do |name|
user = User.new(:name => name)
user.save
assert user.errors[:name].any?, "#{name} is valid."
end
所以它绝对有效。但它太冗长了,我也不能确定我的测试实际测试了所有符号及其组合可能以及所有长度和内容,即使我确信它能按预期工作。
那么,在没有太多完美主义者的情况下测试我的验证是什么是可接受的方法,但是仍然要对大部分逻辑进行测试?
我只是试着编写一个完美的代码,只是为了编写一个完美的代码并忘记主要目标:工作产品吗?
答案 0 :(得分:2)
我这样想:你想测试什么?你对你的正则表达式有多么肯定(在这种情况下简单易行)?
随机字符串测试毫无意义,IMO,对于读者来说毫无意义,因为生成函数的命名很差,因为它并不表示它只会生成与正则表达式匹配的名称,我可以从上下文中收集它,但是它仍然是假设。
TDD的人会在我的脸上打我,但我不相信在最初的开发具有持久价值后离开这些测试。我甚至不相信测试永远有价值,因为逻辑是微不足道的,而且我更多地考虑测试Rails而不是我的验证。Delta我对字符串生成方法的评论,但是,我对您显示的测试没有任何问题。如果要进行测试,这是一种合理的编写方式,很容易将用例添加到其中,除了测试时间略有增加外,它们没有任何危害。
答案 1 :(得分:1)
无论你测试多少,一旦程序变得复杂一点,你就永远不会达到路径覆盖。因此,不要试图测试任何给定的组合,而是尝试测试与已经尝试过的结构上不同的每个组合。因此,例如,如果你得到一个算法,它采用三个整数并构造一个三角形,其中int作为边的长度,尝试只有一个可能的解决方案,但尝试一个不可能的解决方案,因为解决方案可能出错的每个原因,对于三角形,这可能是非数字输入,但也不符合毕达哥拉斯定理的三角形。因此,对于您的示例,不要测试随机字符串,而是测试null,溢出,特殊字符等。