Ruby on rails 3 编写RSpec测试/示例的最佳实践是什么?写一些例子来测试肯定/肯定、否定或两者?
对于BDD和RSpec来说是相当陌生的,我真的很好奇人们在编写RSpec测试/示例时通常会做什么,特别是当它涉及到同一事物的阳性和阴性测试时 以用户名验证和有效用户名仅包含字母数字字符的规则为例 肯定/肯定测试如下:Ruby on rails 3 编写RSpec测试/示例的最佳实践是什么?写一些例子来测试肯定/肯定、否定或两者?,ruby-on-rails-3,bdd,rspec2,rspec-rails,Ruby On Rails 3,Bdd,Rspec2,Rspec Rails,对于BDD和RSpec来说是相当陌生的,我真的很好奇人们在编写RSpec测试/示例时通常会做什么,特别是当它涉及到同一事物的阳性和阴性测试时 以用户名验证和有效用户名仅包含字母数字字符的规则为例 肯定/肯定测试如下: it "should be valid if it contains alphanumeric characters" username = 'abc123' username.should be_valid end it "should be invalid if it
it "should be valid if it contains alphanumeric characters"
username = 'abc123'
username.should be_valid
end
it "should be invalid if it contains non-alphanumeric characters"
username = '%as.12-'
username.should_not be_valid
end
而阴性测试是这样的:
it "should be valid if it contains alphanumeric characters"
username = 'abc123'
username.should be_valid
end
it "should be invalid if it contains non-alphanumeric characters"
username = '%as.12-'
username.should_not be_valid
end
你会写一个测试,而不是另一个吗?你两个都写吗?你能把它们放在同一个测试中吗?我见过人们做上述任何一项的例子,所以我想知道是否有最佳实践,如果有,是什么
编写阳性和阴性测试的示例:
it "should be invalid if it contains non-alphanumeric characters"
username = '%as.12-'
username.should_not be_valid
username = 'abc123'
username.should be_valid
end
我见过这样做的例子,但老实说,我不喜欢这种方法。我倾向于只为了一个目的而保持事物的干净和清晰,就像我们应该如何编写方法一样,因此我更可能编写两个单独的测试,而不是将它们放在一个测试中。那么,有没有一种最佳实践可以说明这种情况?这些例子应该从一个角度,而不是所有角度来测试一个单一的特性/行为。在这种情况下,我会将它们写为正面和负面。这是因为您确实希望确保允许具有有效用户名的人拥有这些用户名,而试图拥有无效用户名的人不能这样做 同样,如果一个应该/不应该有效的用户名与应该有效的用户名相反,那么您已经进行了这些测试,只需在测试的正确类别中添加一个失败的测试,确认测试确实失败,修复它,然后确认测试通过即可
所以,是的,在这种情况下,测试两者。不仅仅是一个或另一个。这种模式通常被称为“每个测试一个断言”:
- 应该对非字母数字无效
- 对于已使用的名称,应无效
- 应仅对数字无效
- 应适用于重音字母
“每个测试一个断言”是一个很好的经验法则。我发现它可能会被过度使用,有时会出现“每个测试一个方面的行为”的情况。这不是那种情况,但我认为值得一提。谢谢您的回复。我想知道你对在同一个例子中写积极和消极测试有什么想法。我见过这样做的例子,但老实说,我不喜欢这种方法。我倾向于只为了一个目的而保持事物的干净和清晰,就像我们应该如何编写方法一样,因此我更可能编写两个单独的测试,而不是将它们放在一个测试中。那么,有没有一种最佳实践可以说明这种情况?示例应该从一个角度测试单个特性/行为,而不是从所有角度。