我被要求在面试中解决一个问题,问题是如果我们给出了将函数作为参数传递的选项,用户可以更改函数的输出(在C ++中,这将是通过传递一个函数指针,执行所需的操作)。之后,面试官问我如何在生产中测试这个。我不能完全确定答案,因为我正在面试我的第一份SWE工作。我的直接解决方案是让断言依赖于用户的输入,或让用户负责测试他自己的方法。
我的问题是,你会怎么做?或者我在哪里可以获得有关最佳实践的信息?
如果我的问题不清楚,想象一下你正在编写linux quicksort函数(不是实际问题,但希望它可以用于说明目的):
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
您如何测试正确性?由于函数的用户是定义(*compar)
函数的用户,因此在我看来,用户在使用函数时应该注意验证正确性。
编辑:一致认为任何方法都需要具有指定的默认行为,并且将针对此预定义行为测试该方法。这是有道理的,因为任何用户都可以通过原始开发人员不会想到的方式修改功能以满足他们的需求,并且因为所有者负责测试。
答案 0 :(得分:0)
当您编写诸如qsort
示例之类的方法时,您的文档必须清楚明确地说明用户定义函数的要求。如果是qsort
示例,the requirements are:
comp
- 比较函数,如果第一个参数小于第二个参数,则返回负整数值, 如果第一个参数大于第二个参数,则为正整数值;如果参数相等,则为零。 比较函数的签名应等同于以下内容:int cmp(const void *a, const void *b);
该函数不能修改传递给它的对象,并且在调用相同的对象时必须返回一致的结果,无论它们在数组中的位置如何。
用户定义的比较功能的供应商负责提供满足这些要求的良好功能,并且他们还负责测试其功能。
但是如果用户完成了他们的作业,他们必须能够依赖你的方法,所以你也必须做好你的作业。假设用户定义的函数确实像必需的,您仍然需要测试自己的方法及其所有角落情况。为此,您必须为自己的测试目的提供至少一个用户定义的函数,然后您需要对该函数进行单元测试,然后再将其输入到实际方法中。
对于qsort
示例,您可以采用一些不同的数据结构,比如int
的数组和一些自定义struct
的数组,然后写入(和单元测试) )他们的比较器。最后,您可以使用这些结构和比较器来测试qsort
本身及其所有边缘情况(不同类型的数组具有不同的元素大小,空数组,重复元素,......)。