Testing 有什么样的测试?

Testing 有什么样的测试?,testing,Testing,我总是独自工作,我的测试方法通常是经常编译,确保我所做的更改工作正常,如果不正常,就进行修复。然而,我开始觉得这还不够,我对那里的标准测试很好奇 有人能告诉我基本测试,每个测试的一个简单例子,以及为什么使用它/它测试什么吗 谢谢。不同的人对什么构成什么样的测试有不同的看法,但这里有一些我认为每个术语的含义。请注意,这严重偏向于服务器端编码,因为我倾向于这样做:) 单元测试 单元测试应该只测试代码的一个逻辑单元——通常是整个测试用例的一个类,以及每个测试中的少量方法。单元测试(理想情况下)小且运行

我总是独自工作,我的测试方法通常是经常编译,确保我所做的更改工作正常,如果不正常,就进行修复。然而,我开始觉得这还不够,我对那里的标准测试很好奇

有人能告诉我基本测试,每个测试的一个简单例子,以及为什么使用它/它测试什么吗


谢谢。

不同的人对什么构成什么样的测试有不同的看法,但这里有一些我认为每个术语的含义。请注意,这严重偏向于服务器端编码,因为我倾向于这样做:)

单元测试

单元测试应该只测试代码的一个逻辑单元——通常是整个测试用例的一个类,以及每个测试中的少量方法。单元测试(理想情况下)小且运行成本低。与依赖项的交互通常通过模拟、伪造或存根之类的双重测试来隔离

集成测试

集成测试将测试不同组件如何协同工作。外部服务(不属于项目范围的服务)可能仍然是伪造的,以提供更多的控制,但项目本身的所有组件都应该是真实的。集成测试可以测试整个系统或某个子系统

系统测试

系统测试类似于集成测试,但也有真正的外部服务。如果这是自动化的,通常系统会设置为已知状态,然后测试客户机独立运行,像真正的客户机一样发出请求(或其他),并观察效果。外部服务可以是生产服务,也可以是仅在测试环境中设置的服务

探测测试

这就像是一个系统测试,但是使用生产服务来完成一切。它们定期运行以跟踪系统的运行状况

验收测试

这可能是定义最不明确的术语——至少在我看来是这样;它可以有很大的不同。它通常是相当高的级别,如系统测试或集成测试。验收测试可由外部实体(标准规范或客户)指定


黑盒还是白盒?

测试也可以是“黑盒”测试(只接触公共API),也可以是“白盒”测试(利用一些额外的知识使测试更容易)。例如,在白盒测试中,您可能知道所有公共API方法都使用特定的内部方法,但测试起来更容易。通过直接调用该方法,您可以测试大量的死角情况,然后使用公共API进行较少的测试。当然,如果您正在设计公共API,那么您可能应该从一开始就将其设计为易于测试的—但它并不总是这样。通常,能够独立于类的其他部分测试一个小方面是很好的

另一方面,黑盒测试通常没有白盒测试那么脆弱:根据定义,如果您只测试API在其契约中保证的内容,那么实现可以在不改变测试的情况下随心所欲地改变。另一方面,白盒测试对实现更改很敏感:例如,如果内部方法发生了细微的更改,或者获得了一个额外的参数,那么您需要更改测试以反映这一点

归根结底,这一切都是为了平衡——测试级别越高,越有可能成为黑匣子。另一方面,单元测试很可能包括白盒测试的元素。。。至少以我的经验来看。有很多人根本拒绝使用白盒测试,只会测试公共API。对我来说,这感觉更教条,而不是务实,但我也看到了好处


开始


现在,关于下一步应该去哪里,单元测试可能是最好的开始。您可以选择在设计类(测试驱动开发)之前编写测试,或者大约在同一时间编写测试,甚至在几个月之后编写测试(这并不理想,但是有很多代码没有测试,但是应该编写)。您会发现您的一些代码比其他代码更易于测试。。。使测试可行(IMO)的两个关键概念是依赖项注入(对接口进行编码并向类提供依赖项,而不是让它们自己实例化这些依赖项)和双重测试(例如,模拟框架可以让你测试交互,或者伪造实现可以在内存中以一种简单的方式完成所有事情)。

我建议至少读一本关于这方面的书,因为这个领域相当庞大,而且书中往往会综合更好的概念。 例如,一个很好的基础可能是:


我认为这样一本书可能比我们在这里发布的一些断章取义的例子更好地解释一切。

嗨……我想补充一下Jon Skeet先生的答案。。 基于白盒测试(或结构测试)和黑盒测试(或功能测试),以下是各类别下的其他测试技术:

  • 结构测试技术
压力测试

这用于测试系统上的大量数据。比系统通常需要的数据量要多。如果系统能够承受这些数据量,它肯定能够很好地接受正常值

例如

可能您可以采取系统溢出的情况,如试图提取超过您的银行余额应不工作,并提取到最大阈值应工作

这主要用于我们不确定您的系统能够处理的容量

执行测试

完成此操作是为了检查系统的熟练程度