Может ли параметр Googletest параметризоваться несколькими различными типами параметров, соответствующих гибкости mbUnit?
Я бы хотел написать тесты С++ Google, которые могут использовать тесты с параметрами параметров с несколькими параметрами разных типов данных, в идеале соответствующие сложности следующих тестов mbUnit, написанных на С++/CLI.
Обратите внимание, насколько это компактно, с атрибутом [Test]
, указывающим, что это тестовый метод и атрибуты [Row(...)]
, определяющие значения для экземпляра.
[Test]
[Row("Empty.mdb", "select count(*) from collar", 0)]
[Row("SomeCollars.mdb", "select count(*) from collar", 17)]
[Row("SomeCollars.mdb", "select count(*) from collar where max_depth=100", 4)]
void CountViaDirectSQLCommand(String^ dbname, String^ command, int numRecs)
{
String^ dbFilePath = testDBFullPath(dbname);
{
StAnsi fpath(dbFilePath);
StGdbConnection db( fpath );
db->Connect(fpath);
int result = db->ExecuteSQLReturningScalar(StAnsi(command));
Assert::AreEqual(numRecs, result);
}
}
Или даже лучше, это более экзотическое тестирование с С# (нажатие границ того, что можно определить в атрибутах .Net, кроме того, что возможно в С++/CLI):
[Test]
[Row("SomeCollars.mdb", "update collar set x=0.003 where hole_id='WD004'", "WD004",
new string[] { "x", "y" },
new double[] { 0.003, 7362.082 })] // y value unchanged
[Row("SomeCollars.mdb", "update collar set x=1724.8, y=6000 where hole_id='WD004'", "WD004",
new string[] { "x", "y" },
new double[] { 1724.8, 6000.0 })]
public void UpdateSingleRowByKey(string dbname, string command, string idValue, string[] fields, double[] values)
{
...
}
help говорит, что тесты с параметрами параметрирования позволят вам написать свой тест только один раз, а затем легко создать экземпляр и запустить его с произвольным числом параметров значения. но я уверен, что это относится к числу тестовых случаев.
Даже без изменения типов данных мне кажется, что параметризованный тест может принимать только параметр один?
Ответы
Ответ 1
Да, есть один параметр. Однако вы можете сделать этот параметр произвольно сложным. Вы можете адаптировать код из документации, чтобы использовать тип Row
, например:
class AndyTest : public ::testing::TestWithParam<Row> {
// You can implement all the usual fixture class members here.
// To access the test parameter, call GetParam() from class
// TestWithParam<T>.
};
Затем определите свой параметризованный тест:
TEST_P(AndyTest, CountViaDirectSQLCommand)
{
// Call GetParam() here to get the Row values
Row const& p = GetParam();
std::string dbFilePath = testDBFullPath(p.dbname);
{
StAnsi fpath(dbFilePath);
StGdbConnection db(p.fpath);
db.Connect(p.fpath);
int result = db.ExecuteSQLReturningScalar(StAnsi(p.command));
EXPECT_EQ(p.numRecs, result);
}
}
Наконец, создайте экземпляр:
INSTANTIATE_TEST_CASE_P(InstantiationName, AndyTest, ::testing::Values(
Row("Empty.mdb", "select count(*) from collar", 0),
Row("SomeCollars.mdb", "select count(*) from collar", 17),
Row("SomeCollars.mdb", "select count(*) from collar where max_depth=100", 4)
));