单元测试:在单元测试方法中使用另一种方法时我做对了吗?

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 想法的库(其中测试框架运行随机测试以发现违反您为生产指定的 属性 代码)。