常见的软件测试方法和分类
黑盒测试(Black Box)
测试内容:黑盒测试是把测试对象看做一个黑盒子,利用黑盒测试法进行动态测试时,需要测试软件产品已经实现的功能是否符合功能设计要求,不需测试软件产品的内部结构和处理过程。
黑盒测试注重于测试软件的功能性需求,也即黑盒测试使软件工程师派生出执行程序所有功能需求的输入条件。黑盒测试并不是白盒测试的替代品,而是用于辅助白盒测试发现其他类型的错误。
黑盒测试具体说明链接:what's the 黑盒测试
白盒测试(White Box)
测试内容:设计者可以看到软件系统的内部结构,并且使用软件的内部知识来指导测试数据及方法的选择。
白盒测试通常被认为是单元测试与集成测试,期中有六种测试方法:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖。
白盒测试具体说明链接:what's the 白盒测试
灰盒测试(Gray Box)
测试内容:介于黑盒和白盒之间,是一种综合测试的方法,他将白盒测试和黑盒测试结合在一起,构成一种无缝测试技术。
灰盒测试是基于程序运行时的外部表现又结合程序内部逻辑结构来设计测试用例,执行程序并采集程序路径执行信息和外部用户接口结果的测试技术。灰盒测试法旨在验证软件满足外部指标以及软件的所有通道或路径都进行了检验。
灰盒测试具体说明链接:what's the 灰盒测试
总结
实际工作中,对系统的了解越多越好。目前大多数的测试人员都是做黑盒测试,很少有做白盒测试的。 因为白盒测试对软件测试人员的要求非常高,需要有很多编程经验。做.NET程序的白盒测试你要能看得懂.NET代码。做JAVA程序的测试,需要你能看懂JAVA的代码。 如果你都能看懂了,你还会做测试么
按测试是手动还是自动上分类
手动测试(Manual Test)
测试内容:测试人员用鼠标去手动测试 (测试GUI),用鼠标各种点点点,手工测试更能容易发现软件的Bug。
自动化测试(Automation Test)
测试内容:用程序测试程序 (测试API),由测试人员根据手工测试的Case来决定自动化测试的Case,再编写程序或者脚本来替代手工做自动化测试
总结
对于项目来说, 手动测试和自动化测试同等重要,都是保障软件质量的方法。 目前大部分的项目组都是手动测试和自动化测试相结合。因为很多测试无法做成自动化,很多复杂的业务逻辑也很难自动化, 所以自动化测试无法取代手动测试。
对于软件测试人员个人发展来说, 做自动化测试是个挑战,也是测试人员发展的一个方向, 需要测试人员学习大量的开发知识(开发的知识真是学无止境啊)。 从长远角度来看,自动化测试肯定是越来越吃香的。而手动测试比较适合刚工作不久的人,手动测试最大的缺点就是技术含量低,单调乏味,容易废人。
总的来说,手工测试胜在测试业务逻辑,而自动化测试胜在测试底层架构。
如果被测试的程序可测试性比较好, 很有必要做成自动化测试。 能做自动化的尽量做成自动化, 比如下面这些情形是可以做自动化的:
按测试的目的分类
功能测试
测试内容:测试的范围从小到大,从内到外, 从程序开发人员(单元测试)到测试人员,到一般用户Alpha/Beta测试
- Unit Test 单元测试:在最低的功能/参数上验证程序的准确性,比如测试一个函数的正确性(开发人员做的)
- Functional Test 功能测试:验证模块的功能 (测试人员做的)
- Integration Test 集成测试:验证几个互相有依赖关系的模块的功能 (测试人员做的)
- Scenario Test 场景测试:验证几个模块是否能完成一个用户场景 (测试人员做的)
- System Test 系统测试:对于整个系统功能的测试 (测试人员做的)
- Alpha 测试:软件测试人员在真实用户环境中对软件进行全面的测试 (测试人员做的)
- Beta 测试:真实的用户在真实的用户环境中进行的测试, 也叫公测 (最终用户做的)
非功能测试
测试内容:一个软件除了基本功能之外,还有很多功能之外的特性,这些叫“Quality of Service requirement”服务质量需求。没有软件的功能,这些特性都无从表现出来,因此,我们要在软件开发的适当阶段-基本功能完成后做这些测试。
- Stress test 压力测试:验证软件在超过负载设计的情况下仍能返回正确的结果,没有崩溃
- Load test 负载测试:测试软件在负载情况下能否正常工作
- Performance test性能测试:测试软件的效能,是否提供满意的服务质量
- Accessibility test:软件辅助功能测试-测试软件是否向残疾用户提供足够的辅助功能
- Localization/Globalization:本地化/全球化测试
- Compatibility Test:兼容性测试
- Configuration Test:配置测试-测试软件在各种配置下能否正常工作
- Usability Test:可用性测试 –测试软件是否好用
- Security Test:软件安全性测试
性能测试
性能测试要求测试人员熟练性能测试工具,比如QTP, LoadRunner, Jmeter。 Visual Studio也提供了很多性能测试的工具. 要求测试人员对低层协议非常理解和编写脚本
性能测试非常有技术含量, 很有发展前途, 是软件测试人员的一个职业发展方向。
性能测试推荐看一本书:《软件性能测试过程详解与案例剖析》
安全性测试
安全性测试的内容很广, 非常有难度啊。 我只接触过XSS(跨站脚本攻击)和SQL注入攻击。
安全性测试非常有技术含量, 我认为也是软件测试人员的一个职业发展方向
按阶段分类
单元测试
是指对软件中的最小可测试单元进行检查和验证。桩模块(stud)是指模拟被测模块所调用的模块,驱动模块(driver)是指模拟被测模块的上级模块,驱动模块用来接收测试数据,启动被测模块并输出结果。
集成测试
是单元测试的下一阶段,是指将通过测试的单元模块组装成系统或子系统,再进行测试,重点测试不同模块的接口部门。集成测试就是用来检查各个单元模块结合到一起能否协同配合,正常运行。
系统测试
指的是将整个软件系统看做一个整体进行测试,包括对功能、性能,以及软件所运行的软硬件环境进行测试。系统测试的主要依据是《系统需求规格说明书》文档。
验收测试
指的是在系统测试的后期,以用户测试为主,或有测试人员等质量保障人员共同参与的测试,它也是软件正式交给用户使用的最后一道工序。 验收测试又分为a测试和beta测试,其中a测试指的是由用户、 测试人员、开发人员等共同参与的内部测试,而beta测试指的是内测后的公测,即完全交给最终用户测试。
按测试的时机和作用分类
在开发软件的过程中,不少测试起着“烽火台”的作用,它们告诉我们软件开发的流程是否畅通。
- Smoke Test:“冒烟”–如果测试不通过,则不能进行下一步工作
- Build Verification Test(BVT):验证构建是否通过基本测试。
- Acceptance Test:验收测试,为了全面考核某功能/特性而做的测试
BVT测试是一种Smoke Test, 指Build生成好之后,自动运行的自动化测试脚本来检查这个Build的基本功能。 如果BVT测试失败了,需要开发人员马上修改,重新生成Build
按测试测策略分类
- Regression Test 回归测试:对一个新的版本,重新运行以往的测试用例,看看新版本和已知的版本相比是否有退化 (regression)
- Ad hoc Test 探索性测试:随机进行的,探索性的测试。
- Sanity Test:粗略的测试, 只需要执行部分的测试用例(比如很多Web网页,确定比较重要以及常用的URL链接是活着的,能正常打开返回数据)
Regression Test 回归测试
对软件测试人员来说就是重复测试,所以回归测试最好是自动化的,否则测试人员就要一遍又一遍地重复测试:
- 开发人员做些小改动,就需要测试人员做回归测试。确保现有的功能没有被破坏
- Bug Fix 也需要回归测试,确保新的代码修复了Fix, 也确保现有的功能没有被破坏
- 项目后期,需要做一个完整回归测试,确保所有的功能都是好的
Ad hoc Test 探索性测试
平常我最喜欢做随机测试了, 抛开test case. 自己按照自己的思路,随便点点。 如果测试GUI,Ad hoc能发现大量的bug。这个主要是基于测试人员对软件系统的了解以及测试人员自己个人的测试经验积累,差不多行成了一种习惯性的操作
其他测试类型
回归测试
是指对软件的新的版本测试时,重复执行上一个版本测试时的用例。是指对软件的新的版本测试时,重复执行上一个版本测试时的用例。
冒烟测试
是指在对一个新版本进行大规模的测试之前,先验证一下软件的基本功能是否实现,是否具备可测性。
随机测试
是指测试中所有的输入数据都是随机生成的,其目的是模拟用户的真实操作,并发现一些边缘性的错误。