我有一些测试数据,想为每个项目创建一个单元测试.我的第一个想法是这样做:
import unittest
l = [["foo", "a", "a",], ["bar", "a", "b"], ["lee", "b", "b"]]
class TestSequence(unittest.TestCase):
def testsample(self):
for name, a,b in l:
print "test", name
self.assertEqual(a,b)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是它在一次测试中处理所有数据.我想在运行中为每个项目生成一个测试.有什么建议?
在我们的项目中,我有几个JUnit测试,例如从目录中获取每个文件并对其进行测试.如果我实现了一个testEveryFileInDirectory方法,TestCase那么只显示一个可能失败或成功的测试.但我对每个文件的结果感兴趣.如何在每个文件中编写一个TestCase/ TestSuite如此单独的测试,例如在Eclipse的图形化TestRunner中?(为每个文件编写显式测试方法不是一种选择.)
目前,我必须为每个我想用几个不同输入测试的方法创建一个参数化测试类.有没有办法在一个文件中添加它?
现在有CalculatorTestAdd.java一组参数用于检查Add()功能是否正常工作.我是否有可能将此连接"连接"到该Add()函数并为该Subtract()方法创建一个额外的集合并在同一测试类中添加此方法,从而导致一个文件被调用CalculatorTest.java?
NUnit支持一项功能,您可以在其中指定一组数据输入,以便多次运行单元测试.
[RowTest]
[Row(1001,1,2,3)]
[Row(1,1001,2,3)]
[Row(1,2,1001,3)]
public void SumTests(int x, int y, int z, int expected)
{
...
}
Run Code Online (Sandbox Code Playgroud)
使用MSTest完成同类事物的最佳方法是什么?我找不到类似的属性集.
可能重复:
如何在python中生成动态(参数化)单元测试?
我正在使用unittest包编写测试,我想避免重复代码.我将进行一些测试,这些测试都需要一个非常类似的方法,但每次只有一个值不同.一个简单而无用的例子是:
class ExampleTestCase(unittest.TestCase):
def test_1(self):
self.assertEqual(self.somevalue, 1)
def test_2(self):
self.assertEqual(self.somevalue, 2)
def test_3(self):
self.assertEqual(self.somevalue, 3)
def test_4(self):
self.assertEqual(self.somevalue, 4)
Run Code Online (Sandbox Code Playgroud)
有没有办法编写上面的例子,而不是每次都重复所有的代码,而是编写一个通用的方法,例如
def test_n(self, n):
self.assertEqual(self.somevalue, n)
Run Code Online (Sandbox Code Playgroud)
告诉unittest用不同的输入尝试这个测试?
我知道如何分别开发类型参数化测试和值参数化测试.我想弄清楚的是,是否可以将两者结合起来.换句话说,创建一个通用测试,该测试采用该类型的任何类型和范围的值.
好吧作为C#NUnit的家伙,这可能很奇怪.
但茉莉花是否允许参数化单元测试?
我不确定它是否违反"声明"和"它"以使非程序员可读.
我见过一些第三方插件,但它们有点陈旧,不确定它是否已添加到茉莉花中.如果我想使用插件
只是为了帮助将来发现这一点的人,我在茉莉花论坛上被告知在Jasmine本身内没有对参数化测试的一流支持.
unit-testing parameterized-unit-test jasmine parameterized-tests
我正在使用DUnit来测试Delphi库.我有时会遇到一些情况,我会编写几个非常相似的测试来检查函数的多个输入.
有没有办法在DUnit中编写(类似的东西)参数化测试?例如,为适当的测试程序指定输入和预期输出,然后运行测试套件并获得有关多次运行测试失败的反馈?
(编辑:一个例子)
例如,假设我有两个这样的测试:
procedure TestMyCode_WithInput2_Returns4();
var
Sut: TMyClass;
Result: Integer;
begin
// Arrange:
Sut := TMyClass.Create;
// Act:
Result := sut.DoStuff(2);
// Assert
CheckEquals(4, Result);
end;
procedure TestMyCode_WithInput3_Returns9();
var
Sut: TMyClass;
Result: Integer;
begin
// Arrange:
Sut := TMyClass.Create;
// Act:
Result := sut.DoStuff(3);
// Assert
CheckEquals(9, Result);
end;
Run Code Online (Sandbox Code Playgroud)
我可能会有更多的这些测试做同样的事情,但有不同的输入和期望.我不想将它们合并到一个测试中,因为我希望它们能够独立通过或失败.
我正在尝试参数化这个测试:
@Test
public void reverseQuote(double[] qsp) throws Exception {
...}
Run Code Online (Sandbox Code Playgroud)
对我来说似乎很荒谬,它不存在一些初始化数组的快速方法qsp,例如ValueSource:
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testWithValueSource(int argument) {
assertNotNull(argument);
}
Run Code Online (Sandbox Code Playgroud)
我的目标是做一些事情@ValueSource(doublesArray = {new double[]{1.0, 2.0, 3.0}})(现在返回错误).不存在什么允许类似的东西?
其他答案似乎只是建议的方式,如使用@MethodSource或@ConvertWith.
我也接受实施其他测试库的答案.
是否可以使用JUnit5的参数化新功能来运行测试类来接收测试参数而不是在方法级别进行测试?
使用JUnit 4,@RunWith(Parameterized::class)可以使用诸如plus继承之类的运行器将参数数组传递给子类,但我不确定是否可以使用新的JUnit 5 api来实现等效的东西.