Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 基于单元测试用生成代码编写的程序_Unit Testing_Tdd_Code Generation - Fatal编程技术网

Unit testing 基于单元测试用生成代码编写的程序

Unit testing 基于单元测试用生成代码编写的程序,unit-testing,tdd,code-generation,Unit Testing,Tdd,Code Generation,在进行测试驱动的开发时,我思考了一个假设的程序是否可以完全由基于测试生成的代码来开发。i、 e.是否有能力创建专门用于通过测试的代码的生成器。编程语言的未来会仅仅是编写测试吗?我认为这将是一个艰难的过程,因为至少在这种技术的最初几代,开发人员会对生成的代码的正确性非常怀疑。因此,人类审查也必须参与其中 作为我的意思的一个简单说明,假设您为一个函数编写了10个测试,样本输入和预期输出涵盖了您所能想到的每个场景。一个程序只需一个基本的switch语句(您的十个输入与它们的预期输出相匹配),就可以生成

在进行测试驱动的开发时,我思考了一个假设的程序是否可以完全由基于测试生成的代码来开发。i、 e.是否有能力创建专门用于通过测试的代码的生成器。编程语言的未来会仅仅是编写测试吗?

我认为这将是一个艰难的过程,因为至少在这种技术的最初几代,开发人员会对生成的代码的正确性非常怀疑。因此,人类审查也必须参与其中

作为我的意思的一个简单说明,假设您为一个函数编写了10个测试,样本输入和预期输出涵盖了您所能想到的每个场景。一个程序只需一个基本的switch语句(您的十个输入与它们的预期输出相匹配),就可以生成通过所有这些测试的代码。这段代码显然是不正确的,但需要一个人才能看到


这只是一个简单的例子。不难想象,更复杂的程序可能不会生成switch语句,但仍然会生成实际上并不正确的解决方案,并且可能以更微妙的方式出错。因此,我的建议是,至少在一开始,任何与此相关的技术都会受到深层次的怀疑。

尽管将来某个时候可能会出现这种情况,但可以使用简单的测试来生成代码:

assertEquals(someclass.get_value(), true)
但是,从黑箱集成测试中获得正确的输出是一个NP完全问题:

assertEquals(someclass.do_something(1), file_content(/some/file))

assertEquals(someclass.do_something(2), file_content(/some/file))
assertEquals(someclass.do_something(2), file_content(/some/file2))

assertEquals(someclass.do_something(3), file_content(/some/file2))

这是否意味着生成的代码将始终写入/some/文件?这是否意味着生成的代码应该始终写入/some/file2?两者都可能是真的。如果它只需要执行最小集就可以通过测试,该怎么办?如果不了解上下文并编写非常精确和有边界的测试,任何代码都无法理解(此时)测试作者的意图。

如果可以完全生成代码,那么生成器的基础必须是准确描述代码的规范。这个生成器将类似于将一种语言交叉编译成另一种语言的编译器

考试不是这样一种语言。它们只声明代码功能的特定方面是有效的且未更改。通过这样做,他们构建了代码的框架,使其即使在重构时也不会中断

但我如何比较这两种发展方式呢

1) 如果发电机工作正常,则规格始终转换为正确的代码。我假设这段代码是经过设计测试的,不需要额外的测试。生成程序的TDD优于生成的代码

2) 在我看来,无论您是否有导致生成代码的规范,还是表示为确保代码工作的测试的规范,都是相当等效的

3) 您可以将两种开发方式结合起来。从一个规范生成一个程序框架和一个经过测试的生成器,然后使用TDD丰富生成的代码。注意:然后在一个项目中运行两个不同的开发周期。这意味着,您必须确保在规范更改时始终可以重新生成生成的代码,并且您的附加代码仍然正确地适合生成的代码


仅举一个小例子:想象一个可以从UML类图生成代码的工具。这可以通过使用TDD开发方法来实现,但是类的结构是在UML中定义的,您不需要再次进行测试。

不幸的是,我认为这个问题不够具体,任何人都无法提供合理的答案,除非现有的系统已经允许这样做。你基本上描述了机器学习。为什么代码不正确?您可以在测试中使用变量,并为函数域的整个间隔定义函数的所需值,然后switch语句将使用这些变量为所需输出使用表达式。“为函数域的整个间隔定义函数的所需值”这叫做实现函数!是的,我也意识到了这一点。应该有支持测试驱动开发的工具,从具体的tets用例到更抽象的测试用例,再到完全抽象的函数定义。