Unit testing 我怎样才能说测试(软件)是正确的?

Unit testing 我怎样才能说测试(软件)是正确的?,unit-testing,testing,qa,Unit Testing,Testing,Qa,我正在与一家生产硬件/固件的大公司进行技术面试 对于他们的一款产品,他们成立了一个团队来测试固件,因为固件是不可升级的——你不想运送3000万个你知道的有缺陷的设备 所以他们的客户给了他们规范,固件团队开发了固件,最后这个团队在C、CANoe和一些开发板的帮助下开始测试它 例如,他们将固件闪存到电路板中,然后验证电路板固件的行为是否与规范一致。例如,必须返回特定消息,或者必须在Y之后执行X,等等。。。。通常的单元测试都是测试内容 这些单元测试或集成测试实际上是用C编写的软件本身,因此可能存在错误

我正在与一家生产硬件/固件的大公司进行技术面试

对于他们的一款产品,他们成立了一个团队来测试固件,因为固件是不可升级的——你不想运送3000万个你知道的有缺陷的设备

所以他们的客户给了他们规范,固件团队开发了固件,最后这个团队在C、CANoe和一些开发板的帮助下开始测试它

例如,他们将固件闪存到电路板中,然后验证电路板固件的行为是否与规范一致。例如,必须返回特定消息,或者必须在Y之后执行X,等等。。。。通常的单元测试都是测试内容

这些单元测试或集成测试实际上是用C编写的软件本身,因此可能存在错误,例如C内存泄漏或误报

例如,这是一个错误的测试:

public bool TestEngineOffAfterTime(int timeToWait) {
  return true;
}
它在形式上是正确的,编译过,但它是错误的

我得到的问题是:你如何判断测试是正确的

我离开了面试,但不知道答案

社区能帮忙吗? 我自己找不到答案。

测试团队 要捕获此类错误,您需要多种质量保证技术,例如:

找到对领域知识有很好理解的优秀测试人员 关注细节的测试人员 基本业务逻辑的自动化测试 集成测试 代码更改后的回归测试。 基于风险的测试 验收测试 性能、压力和负载测试 安装和配置测试 安全测试 API测试和单元测试 适航性试验 安装鉴定测试 分贝测试 网络服务 网络兼容性 突变试验 集成测试 可访问性测试 ... 开发团队: 开发人员的最佳实践是设置

同行代码审查, 代码覆盖率和 代码分析工具 ... 确保此类错误不会转移到生产中

这些自动化工具包括:

:同行和经验丰富的开发人员之间的代码审查。 :查找代码中的错误和漏洞。 :查找java程序中的错误。 ...
这听起来像一个诡计问题或所谓的开放式问题

我想说,一般来说,没有办法100%确保测试在现实的开发环境中是正确的。你只能减少这些误报的机会。您可以进行参数测试并生成大量测试用例,以探索测试中例程的输入空间。您需要有良好的测试实践来减少测试中的人为错误。您需要有良好的开发实践以及提到的块X


然而,我不认为有一种方法可以确保测试在形式上是正确的。是的,您可以使用形式验证来确保算法有效。要确保一段代码正常工作,这要困难得多。显然,由于测试是一个程序,它不能从黑盒测试的角度来决定,甚至不可能决定一个具有有限输入和输出空间的例程。如果例程不是无状态的呢

当测试在新代码更改后尽快检测到问题时,您可以判断测试是否正确。如果您更改了此特定测试检查的源代码部分中的任何内容,但失败了,这是一个伟大的测试。如果您正在对代码库进行更改并在之后运行此测试,则表明一切正常-这是一个不正确的测试。

是的,谢谢,但我的问题是在开发团队之后提出的。在所有这些工具之后,测试团队开始发挥作用。这些工具也不能解决根本问题:软件是否做了它应该做的事情?不。是的,这是一个开放式的问题,但不是我所说的技巧性问题——这是一个很好的机会来讨论测试应该如何透明地审查,如何与特定的要求联系起来,甚至可能提到TDD和突变测试——后者可以帮助识别冗余或无效的测试。???这不是不合身,如果你看的话,它非常精确。我描述了问题,并准确地描述了问题。它与软件测试有关。这是一个半正确的答案。在大多数情况下,单元测试和集成测试应该测试行为,而不是实现,以便在不更改测试的情况下进行重构