当前位置:主页 > 超级变态传奇 >

如何用静态分析补充TDD

发布时间:2019-06-24 09:45 编辑:超级变态传奇 来源:http://www.cglo.cn

TDD很精彩

测试驱动开发(TDD)是一种基于非常短的开发周期迭代的软件开发技术。您首先编写一个测试,其中包含您要引入的更改,然后编写代以通过测试,最后您将重新编译新代以满足相应的标准。我不会详述TDD是什么:有很多关于这个主题的文章,你可以在互联网上轻松找到。

我认为在使用TDD时不要通过创建大量测试来让自己被带走,这一点尤其重要。测试允许您显示每天编写大量代行的虚假活动。但与此同时,产品的能将变得非常缓慢。您几乎可以花费全部精力和时间编写测试代。此外,当能发生变化时,测试有时会耗费大量人力。

这就是我们在开发PVS-Studio时不使用纯粹形式的TDD的原因。如果我们为各个函数编写测试,开发时间将增长几十倍。原因是:要调用函数扩展typedef中的类型或执行一些代分析,我们必须准备相当多的输入数据。我们还需要在内存中构建一个正确的解析树片段并填充许多结构。所有这些都需要花费太多时间。

我们使用另一种技术。我们的TDD测试是以特殊方式标记的小型C / C ++代片段。首先,我们编写了要生成某些警告的各种情况。然后我们开始实现代来检测它们。粗略地说,这些测试看起来像这样:

 int A(){int x;返回x; //呃} 

此测试检查程序是否生成有关使用未初始化变量的警告。当然,这个错误最初不存在。我们实施诊断,然后为特殊情况添加新测试。

 int B(){static int x;返回x; //好} 

这里的一切都很好,因为变量是静态变量。

当然,这不是使用TDD的规范方式。但这是重要的结果,而不是形式,不是吗?这个想法是一样的:我们从一组未通过的测试开始;然后实施诊断,编写新文本,进行重构等。

纯粹形式的TDD无法在任何地方使用。例如,这是我们的情况。如果您想使用这种方法,但对您来说不方便,请尝试从更高的抽象级别查看它。我们认为我们已经做到了。

TDD很精彩,但不要生气

如果您使用大量测试,可能会给您一种虚假的安全感,这会使程序员降低代质量控制。 TDD允许您在开发阶段检测到许多缺陷 - 但绝不是全部缺陷。不要忘记其他测试方法。

在研究许多开源应用程序的源代时,我经常注意到单元测试使用的两个相同缺点。 TDD确实有其他的,但我现在不会谈论它们。至少,它们并没有引起我的注意。

因此,这些是进行测试时的两个典型问题:

1)测试本身未经过测试。

2)测试不会检查罕见的危急情况。

为测试编写测试实在太多了。但我们应该记住,测试也是一个程序代,也可能出现错误。有些情况下,测试只是假装检查一些东西。

怎么办?至少应该使用其他工具进行代质量控制。这些可以是动态或静态代分析器。当然,它们并不能保证检测到测试中的所有错误,但是在复合体中使用各种工具会产生非常好的结果。

例如,在运行PVS-Studio检查新项目时,我经常遇到测试代中的错误。以下是Chromium项目的一个例子。

 TEST(SharedMemoryTest,MultipleThreads){....int threadcounts [] = {1,kNumThreads};for(size_t i = 0;?i 

某些测试必须在一个线程中启动,然后在多个线程中启动。由于印刷错误,并未测试并行算法工作。错误在于:sizeof(threadcounts)/ sizeof(threadcounts)。

以下原则将在很大程度上保护您免受测试中的错误。不能通过新写的测试:它可以帮助您确保测试真正检查某些内容。只有在那之后,您才可以开始实施新能。

但是,它并不能始终阻止测试中的错误。上面显示的代也不会首先传递,因为错误仅在parall的数量TDD很精彩

测试驱动开发(TDD)是一种基于非常短的开发周期迭代的软件开发技术。您首先编写一个测试,其中包含您要引入的更改,然后编写代以通过测试,最后您将重新编译新代以满足相应的标准。我不会详述TDD是什么:有很多关于这个主题的文章,你可以在互联网上轻松找到。

我认为在使用TDD时不要通过创建大量测试来让自己被带走,这一点尤其重要。测试允许您显示每天编写大量代行的虚假活动。但与此同时,产品的能将变得非常缓慢。您几乎可以花费全部精力和时间编写测试代。此外,当能发生变化时,测试有时会耗费大量人力。

这就是我们在开发PVS-Studio时不使用纯粹形式的TDD的原因。如果我们为各个函数编写测试,开发时间将增长几十倍。原因是:要调用函数扩展typedef中的类型或执行一些代分析,我们必须准备相当多的输入数据。我们还需要在内存中构建一个正确的解析树片段并填充许多结构。所有这些都需要花费太多时间。

我们使用另一种技术。我们的TDD测试是以特殊方式标记的小型C / C ++代片段。首先,我们编写了要生成某些警告的各种情况。然后我们开始实现代来检测它们。粗略地说,这些测试看起来像这样:

 int A(){int x;返回x; //呃} 

此测试检查程序是否生成有关使用未初始化变量的警告。当然,这个错误最初不存在。我们实施诊断,然后为特殊情况添加新测试。

 int B(){static int x;返回x; //好} 

这里的一切都很好,因为变量是静态变量。

当然,这不是使用TDD的规范方式。但这是重要的结果,而不是形式,不是吗?这个想法是一样的:我们从一组未通过的测试开始;然后实施诊断,编写新文本,进行重构等。

纯粹形式的TDD无法在任何地方使用。例如,这是我们的情况。如果您想使用这种方法,但对您来说不方便,请尝试从更高的抽象级别查看它。我们认为我们已经做到了。

TDD很精彩,但不要生气

如果您使用大量测试,可能会给您一种虚假的安全感,这会使程序员降低代质量控制。 TDD允许您在开发阶段检测到许多缺陷 - 但绝不是全部缺陷。不要忘记其他测试方法。

在研究许多开源应用程序的源代时,我经常注意到单元测试使用的两个相同缺点。 TDD确实有其他的,但我现在不会谈论它们。至少,它们并没有引起我的注意。

因此,这些是进行测试时的两个典型问题:

1)测试本身未经过测试。

2)测试不会检查罕见的危急情况。

为测试编写测试实在太多了。但我们应该记住,测试也是一个程序代,也可能出现错误。有些情况下,测试只是假装检查一些东西。

怎么办?至少应该使用其他工具进行代质量控制。这些可以是动态或静态代分析器。当然,它们并不能保证检测到测试中的所有错误,但是在复合体中使用各种工具会产生非常好的结果。

例如,在运行PVS-Studio检查新项目时,我经常遇到测试代中的错误。以下是Chromium项目的一个例子。

 TEST(SharedMemoryTest,MultipleThreads){....int threadcounts [] = {1,kNumThreads};for(size_t i = 0;?i 

某些测试必须在一个线程中启动,然后在多个线程中启动。由于印刷错误,并未测试并行算法工作。错误在于:sizeof(threadcounts)/ sizeof(threadcounts)。

以下原则将在很大程度上保护您免受测试中的错误。不能通过新写的测试:它可以帮助您确保测试真正检查某些内容。只有在那之后,您才可以开始实施新能。

但是,它并不能始终阻止测试中的错误。上面显示的代也不会首先传递,因为错误仅在parall的数量

上一篇:Angel Studios收购了Angel Studios

下一篇:我和DS约会

相关内容