Может ли значение Googletest, параметризованное несколькими различными типами параметров, соответствовать гибкости mbUnit? - PullRequest
16 голосов
/ 06 июня 2011

Я хотел бы написать C ++ Google тесты, которые могут использовать параметризованные по значению тесты с несколькими параметрами различных типов данных, идеально подходящие для сложности следующих тестов mbUnit, написанных на C ++ / 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);
   }
}

Или, что еще лучше, это большеэкзотическое тестирование из C # (расширение границ того, что может быть определено в атрибутах .Net, за пределы того, что возможно в C ++ / 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 Ответ

28 голосов
/ 06 июня 2011

Да, есть один параметр.Вы можете сделать этот параметр сколь угодно сложным.Вы можете адаптировать код из документации для использования вашего 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)
));
...