我尝试在Android Studio中运行参数化单元测试,如下所示.
import android.test.suitebuilder.annotation.SmallTest;
import junit.framework.TestCase;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameter;
import org.junit.runners.Parameterized.Parameters;
import java.util.Arrays;
import java.util.Collection;
@RunWith(Parameterized.class)
@SmallTest
public class FibonacciTest extends TestCase {
@Parameters
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][] {
{0, 0}, {1, 1}, {2, 1}, {3, 2}, {4, 3}, {5, 5}, {6, 8}
});
}
@Parameter // first data value (0) is default
public /* NOT private */ int fInput;
@Parameter(value = 1)
public /* NOT private */ int …Run Code Online (Sandbox Code Playgroud) android unit-testing parameterized parameterized-unit-test android-studio
我有一堆@ParameterizedTest从 a 接收参数的s@MethodSource具有非常详细的toString()结果(例如 Selenium 的WebDriver)。这些默认情况下用于组成相应的显示名称。从JUnit 5 用户指南:
默认情况下,参数化测试调用的显示名称包含调用索引和该特定调用的所有参数的字符串表示。但是,您可以通过注释的
name属性自定义调用显示名称@ParameterizedTest[…]
虽然这允许在一定程度上自定义显示名称,但似乎我无法调整各个参数的字符串表示形式。不幸的是,指定生成器@DisplayNameGeneration只能在类级别应用,并且不会影响参数化测试调用的显示名称。
有没有办法使用DisplayNameGeneratorfor@ParameterizedTest或自定义给定参数的字符串表示?
基本上我希望能够将方法插入到NUnit中的TestCase或TestFixture来改变行为.本质上我想这样做:
[TestFixture]
public class MethodTests
{
public delegate void SimpleDelegate();
public static void A()
{
// Do something meaningful
}
public static void B()
{
// Do something meaningful
}
public static void C()
{
// Do something meaningful
}
[TestCase(A,B,C)]
[TestCase(C,A,B)]
[TestCase(C,B,A)]
public void Test(SimpleDelegate action1, SimpleDelegate action2, SimpleDelegate action3 )
{
action1();
action2();
action3();
}
}
Run Code Online (Sandbox Code Playgroud)
我收到的[TestCase(A,B,C)]的错误是
你知道是否有办法让这个或类似的东西工作?
当你运行JUnit 4 ParameterizedTest与Eclipse的TestRunner,图形表示是相当愚蠢的:每个测试你有一个叫做节点[0],[1]等等是否有可能给测试[0],[1]等明确的名字呢?实现toString测试方法似乎没有帮助.
有没有办法使用参数化单元测试,类似于使用NUnit框架在.Net中可以实现的.
[TestCase(12, 3, 4)]
[TestCase(12, 2, 6)]
[TestCase(12, 4, 3)]
public void DivideTest(int expectedResult, int a, int b)
{
Assert.AreEqual(expectedResult, a / b);
}
Run Code Online (Sandbox Code Playgroud)
使用这种测试(与非参数化测试相比)可以让您避免编写一系列几乎相同的单元测试,而不仅仅是参数值.
我正在寻找基于XCTest的解决方案或其他一些方法来实现它.最佳解决方案应该在Xcode中将每个测试用例(参数集)报告为单独的单元测试,因此是否所有测试用例或仅有一些测试用例失败是明确的.
有没有一种方法可以同时测试类(如您可以在JUnit 4中使用Parameterized和进行参数化@Parameters)和测试方法(如您可以在JUnit 4或@ParameterizedTestJUnit 5中使用JUnitParams进行参数化)的参数?我需要最后获取参数的笛卡尔积。
java.nio.ByteBuffer使用所需方法的部分测试示例:
public class ByteBufferTest {
private static final int BUFFER_SIZE = 16384;
private final ByteOrder byteOrder;
private ByteBuffer sut;
@Factory(dataProvider = "byteOrders")
public ByteBufferTest(ByteOrder byteOrder) {
this.byteOrder = byteOrder;
}
@DataProvider
public static Object[][] byteOrders() {
return new Object[][] {
{ByteOrder.BIG_ENDIAN},
{ByteOrder.LITTLE_ENDIAN}
};
}
@BeforeMethod
public void setUp() {
sut = ByteBuffer.allocate(BUFFER_SIZE);
sut.order(byteOrder);
}
@Test(dataProvider = "validPositions")
public void position(int position) {
System.out.println(byteOrder + " position " + position); …Run Code Online (Sandbox Code Playgroud) 我使用 JUnit 5 作为我的测试运行器。
在该设置方法中,我硬编码3个PARAMS( ,platformName,platformVersion和deviceName)。我有一个测试方法应该测试各种组合......这意味着,在运行我的testLogin()测试时,它应该在多个平台名称、版本、设备名称上运行......
所以,我尝试如下...
@BeforeEach
@CsvSource({"IOS,13.0,iPhone X Simulator", "IOS,13.2,iPhone Simulator", "IOS,13.3,iPhone XS Simulator"})
void setUp(String platformName, String platformVersion, String deviceName) throws MalformedURLException {
....
capabilities.setCapability("platformName", platformName);
capabilities.setCapability("platformVersion", platformVersion);
capabilities.setCapability("deviceName", deviceName);
capabilities.setCapability("methodName", testInfo.getDisplayName());
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,beforeEach()方法如何可以参数化?另外,我想获取测试方法名称...所以,如果我指定参数,那么我应该在哪里指定 TestInfo 参数。
请帮我。我也看到了下面的问题...
JUnit 5 中的 beforeEach/beforeAll 参数化
========
public class TestBase {
@BeforeEach
void setUp(TestInfo testInfo) throws MalformedURLException {
MutableCapabilities capabilities = new MutableCapabilities();
capabilities.setCapability("platformName", "iOS");
capabilities.setCapability("platformVersion", "13.2");
capabilities.setCapability("deviceName", "iPhone Simulator");
capabilities.setCapability("name", …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 JUnit 5 编写一个测试,该测试应该测试某些参数的多种组合。本质上我想测试来自不同来源的输入的一些笛卡尔积。考虑以下测试:
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
class CartesianProductTest {
@ParameterizedTest
@CsvFileSource(resources = { "values.csv" })
void testIt(int input, int expected, int otherParameter) {
assertEquals(expected, methodUnderTest(input, otherParameter));
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,我只有input和 ,expected并且values.csv应该otherParameter测试一些固定值,这些固定methodUnderTest()值总是返回所有这些值的预期值。不知何故,我必须提供 CSV 中所有值以及所有值otherParameter可以采用的笛卡尔积。我查看了/sf/answers/4035366191/,但这需要对我的所有测试用例进行硬编码或手动读取 CSV 以提供值流。我更多地想到了类似的事情
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.CsvFileSource;
class CartesianProductTest {
@ParameterizedTest
@MethodSource
void testIt(int input, int expected, int otherParameter) {
assertEquals(expected, methodUnderTest(input, otherParameter)); …Run Code Online (Sandbox Code Playgroud) 我有一个加速测试案例.无论参数如何,都会执行此测试用例的大多数行.但是有些部分是根据提供的参数执行的.我想避免编写两个单独的测试用例,除了一些小部分外几乎完全相同.所以我需要使用类似以下方法的方法来创建参数化测试用例:
BOOST_FIXTURE_TEST_CASE(caseA, Fixture)
{
TestFunction("parameterA");
}
BOOST_FIXTURE_TEST_CASE(caseB, Fixture)
{
TestFunction("parameterB");
}
void TestFunction(string param)
{
// ...
// lots of common checks regardless of parameters
// ...
if(param == "parameterA")
BOOST_CHECK(...);
else if(param == "parameterB")
BOOST_CHECK(...);
}
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以更方便的方式实现我的目标?我可以找到BOOST_PARAM_CLASS_TEST_CASE宏,但我不确定它在这种情况下是否相关.
从3.4版开始,Python 在编写unittests时支持简单的subtest语法。一个简单的示例如下所示:
import unittest
class NumbersTest(unittest.TestCase):
def test_successful(self):
"""A test with subtests that will all succeed."""
for i in range(0, 6):
with self.subTest(i=i):
self.assertEqual(i, i)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
运行测试时,输出为
python3 test_foo.py --verbose
test_successful (__main__.NumbersTest)
A test with subtests that will all succeed. ... ok
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Run Code Online (Sandbox Code Playgroud)
但是,在我的实际用例中,子测试将取决于更复杂的可迭代项,并检查每个子测试有很大不同的内容。因此,我宁愿对每个子测试进行计数并将其作为单独的测试用例列出在输出中(Ran 6 tests in ...在此示例中),以获取完整的图片。
使用unittestPython中的普通模块是否可以通过某种方式实现?鼻子测试生成器功能将分别输出每个测试,但是如果可能的话,我希望与标准库保持兼容。