Ruby on rails 如何正确地进行测试?

Ruby on rails 如何正确地进行测试?,ruby-on-rails,testing,Ruby On Rails,Testing,例如,我想验证名称是否仅为字母,长度是否在4到14个字母之间。我在模型中有以下代码: validates: name, :format => { :with => /^[a-zA-Z]+$/, :message => 'Name should be letters only. }, :length => { :minimum => 4, :maxim

例如,我想验证名称是否仅为字母,长度是否在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
所以它确实非常有效。但是它太冗长了,而且我不能确定我的测试是否真的测试了所有可能的符号和它们的组合,以及所有的长度和内容,尽管我肯定它能按预期工作。
那么,什么是可以接受的方法来测试我的验证,而不是太过完美主义,同时又不测试大部分逻辑?

我是不是脑子里有一个小把戏,就是试图写一个完美的代码,只是为了写一个完美的代码,却忘记了主要的完成目标:工作产品?

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

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

TDD的人会打我的脸,但我不相信在最初的开发之后离开这些测试会有持久的价值。我甚至不相信为此进行测试有任何价值,因为逻辑是琐碎的,我觉得它更多的是测试Rails,而不是验证


Delta我对字符串生成方法的评论,但是,我对您显示的测试没有任何问题。如果要进行测试,这是一种合理的编写方法,向其中任何一个添加用例都很容易,而且除了测试时间稍微增加外,它们都不会造成伤害。

无论您进行了多少测试,一旦程序变得稍微复杂,您将永远无法达到路径覆盖率。因此,与其尝试测试任何给定的组合,不如尝试测试与已经尝试过的组合在结构上不同的每个组合。例如,如果你有一个算法,它取三个整数,构造一个以整数为边长的三角形,只尝试一个可能的解,但尝试一个不可能的解,因为每个解都可能出错,对于三角形,这可能是非数值输入,但也可能是不符合毕达哥拉斯定理的三角形。因此,对于您的示例,不要测试随机字符串,而是测试null、溢出、特殊字符等。

好吧,我是一名初级开发人员,但即使有这样的验证,我实际上在正则表达式中遗漏了一些错误:我忘了放起点和终点,所以像“John1”这样的名称是有效的,所以测试在这里帮助了我。然而,正如你所说,它仍然是跛脚的xD@Konnigun不过,我真的不会说他们是“瘸子”。尤其是在不确定的情况下,最好还是谨慎行事。成本(相对)较低。是的,你说得对,谢谢!对于特殊字符,我只能测试其中的一小部分,实际上我不能测试所有字符和所有的组合,所以仍然有一些错误窗口,但仍然没有什么是完美的,尝试测试每一个字符是不需要的,特别是对于这样一个简单的正则表达式