单元测试:在单元测试方法中使用另一种方法时我做对了吗?
Unit testing: Am I doing right when using another method in unit testing a method?
据我所知,应该对每个 public API 单独进行单元测试。但是,我一直遇到这样一种情况,我没有找到一种明确的方法来独立地对每个 API 进行单元测试,如下例所示:
class MyStorage {
private:
std::vector<int> int_vec_;
public:
bool insert_int(int value);
int get_value_at(int idx);
}
我使用了GooogleTest框架,编写了如下单元测试:
int int_tenth(int x) { return x * 10; }
TEST_F(MyStorageTest, insert_int) {
for(int i = 0; i < 10; i++) {
int value = int_tenth(i);
bool ret = my_storage.insert_int(value);
ASSERT_TRUE(ret);
}
}
TEST_F(MyStorageTest, get_value_at) {
for(int i = 0; i < 10; i++) {
int value = int_tenth(i);
my_storage.insert_int(value);
}
for(int i = 0; i < 10; i++) {
int expected_value = int_tenth(i);
int value = my_storage.get_value_at(i);
ASSERT_EQ(expected_value, value);
}
}
我做的对吗?如果没有,我如何为这个例子做单元测试?
我觉得这看起来 "okay"。您的测试用例正在使用这两个 API - 是的,您需要使用 insert 方法来测试 get 方法。
缺少什么:极端情况,尤其是 get。比如:有负索引的测试用例。或无效索引。此类测试应该会导致某些错误 - 您可能希望确保出现预期的错误(例如异常)。
除此之外,您可能还想查看基于 QickCheck 想法的库(其中测试框架运行随机测试以发现违反您为生产指定的 属性 代码)。
据我所知,应该对每个 public API 单独进行单元测试。但是,我一直遇到这样一种情况,我没有找到一种明确的方法来独立地对每个 API 进行单元测试,如下例所示:
class MyStorage {
private:
std::vector<int> int_vec_;
public:
bool insert_int(int value);
int get_value_at(int idx);
}
我使用了GooogleTest框架,编写了如下单元测试:
int int_tenth(int x) { return x * 10; }
TEST_F(MyStorageTest, insert_int) {
for(int i = 0; i < 10; i++) {
int value = int_tenth(i);
bool ret = my_storage.insert_int(value);
ASSERT_TRUE(ret);
}
}
TEST_F(MyStorageTest, get_value_at) {
for(int i = 0; i < 10; i++) {
int value = int_tenth(i);
my_storage.insert_int(value);
}
for(int i = 0; i < 10; i++) {
int expected_value = int_tenth(i);
int value = my_storage.get_value_at(i);
ASSERT_EQ(expected_value, value);
}
}
我做的对吗?如果没有,我如何为这个例子做单元测试?
我觉得这看起来 "okay"。您的测试用例正在使用这两个 API - 是的,您需要使用 insert 方法来测试 get 方法。
缺少什么:极端情况,尤其是 get。比如:有负索引的测试用例。或无效索引。此类测试应该会导致某些错误 - 您可能希望确保出现预期的错误(例如异常)。
除此之外,您可能还想查看基于 QickCheck 想法的库(其中测试框架运行随机测试以发现违反您为生产指定的 属性 代码)。