了解单元测试

Dav*_*vid 4 php testing unit-testing codeigniter

我试图了解单元测试的工作原理.到目前为止,我知道你正在根据你输入的内容测试函数的输出.好的.这是否意味着如果您的函数唯一可能返回一个数据类型,您只需要为它编写一个测试?所以说我写的函数只有返回TRUE或FALSE的可能性,这是否意味着我只是检查响应是否是布尔值?

然后还说我有一个从数据库中提取博客帖子的功能.假设将函数设置为:如果行数= 0,则返回FALSE,否则返回结果.所以我现在有可能返回一个布尔值或数组的函数.你怎么测试那个?该函数现在不仅仅依赖于输入,而是依赖于数据库中的内容.

Osw*_*ald 9

有用的功能不会返回truefalse随机.它true 在某些情况下false 其他情况下返回.

因此,单元测试将做三件事(按此顺序):

  1. 创建一个环境,从中您可以知道函数是否应该返回truefalse(此环境称为测试夹具).
  2. 运行要测试的功能.
  3. 将功能结果与您的期望进行比较.

显然,这不能用所有可能的输入完成(如果可以做,这将是一个证明,而不是测试),因此单元测试的艺术是选择合适的测试夹具.有两种方法可以解决这个问题:

  • 黑盒测试会查看选择灯具的功能规格:什么是有效输入值以及它们应该如何影响输出?
  • 白盒测试查看函数并选择夹具,使得函数的每个语句都由至少一个夹具执行.

...如果行数= 0,则返回FALSE,否则返回结果.

如果这样的函数通过调用DBMS的API(例如mysql_query)直接向数据库服务器发送查询,则测试夹具的创建将包括

  1. 设置数据库.
  2. 将行插入数据库(或不是,取决于测试是否应检查结果是否正确返回或FALSE正确返回).

另一方面,如果该函数调用自定义函数(例如由对象关系映射器提供),则测试夹具应提供该自定义函数的模拟实现.依赖注入有助于确保调用者和被调用者失去耦合,因此真正的实现可以在运行时替换为模拟实现.


pro*_*son 5

你有关于正确的要点.如果设备有外部特性,则有两种方法.创建Mock类或使用某种类型的fixture.

使用数据库示例如果您正在测试必须调用数据访问类以从数据库中提取数据的类,那么您通常会模拟该数据访问类,使您计划从中调用的方法返回您期望的响应.

另一方面,如果您实际上是在测试数据访问类本身,那么您将使用一个fixture - 一个填充了您知道的数据的测试数据库.然后测试数据访问类是否返回了正确的数据.