1

例如,我想验证名称只是字母并且长度在 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

所以它肯定工作得很好。但这太冗长了,我也不能确定我的测试实际上测试了所有可能的符号及其组合以及所有长度和东西,即使我确信它按预期工作。
那么,什么是可以接受的测试我的验证的方法,而不是过于完美主义者,但又要对大部分逻辑进行测试?
我是否只是想编写一个完美的代码只是为了编写一个完美的代码而忘记了主要的完成目标:工作产品?

4

2 回答 2

2

我是这样想的:你想测试什么?你对你的正则表达式有多确定(在这种情况下是非常简单的)?

随机字符串测试是毫无意义的,IMO,对读者来说毫无意义,因为生成函数的名称很糟糕,因为它并不表示它只会生成与正则表达式匹配的名称,我可以从上下文中收集到,但它仍然是假设

TDD 的人会打我的脸,但我不相信在初始开发后离开这些测试具有持久的价值。我什至不相信为此进行测试是否有价值,因为逻辑很简单,而且它让我觉得更多的是测试 Rails 而不是我的验证。

Delta 我对字符串生成方法的评论,但是,我对你展示的测试没有任何问题。如果要进行测试,这是一种合理的编写方式,很容易添加用例,除了测试时间略有增加外,它们没有任何害处。

于 2013-03-12T11:37:43.350 回答
1

无论您进行多少测试,一旦程序变得更加复杂,您将永远无法达到路径覆盖率。因此,与其尝试测试任何给定的组合,不如尝试测试在结构上与已经尝试过的组合不同的每个组合。因此,例如,如果您有一个算法,它采用三个整数并以整数作为边长构造一个三角形,请仅尝试一个可能的解决方案,但由于解决方案可能错误的各种原因尝试一个不可能的解决方案,对于三角形,这可能是非数字输入,还有不满足勾股定理的三角形。因此,对于您的示例,不要测试随机字符串,而是测试 null、溢出、特殊字符等。

于 2013-03-12T11:40:39.157 回答