了解软件测试的工作原理和测试内容

时间:2010-06-17 20:43:27

标签: unit-testing testing automated-tests

简介:
我在这里看到很多关于软件测试和其他我不理解的术语的主题。

问题:
不幸的是,作为一名初学者,我不知道软件测试是如何工作的,甚至不知道如何测试一个简单的函数。这是一种耻辱,但这就是事实。我也希望这个问题也可以帮助其他初学者。

问题:
你能帮我理解一下这个主题吗?

也许一些问题可能会有所帮助:

  • 当我开发一个函数时,我该如何测试它?例如:使用sum函数时,我应该测试每个输入值还是仅测量一些限制?如何用字符串作为参数测试函数?
  • 在一个大型程序中,我是否必须测试它的每一段代码?当你们编程时,你是否测试了所有编写的代码?
  • 自动化测试的工作原理以及如何尝试?自动化测试的工具如何工作以及它们的作用?
  • 我听说过单元测试。我可以对此作一个简短的解释吗?
  • 什么是测试框架?

如果可能的话,请发布一些带有示例的代码来澄清这些想法。

非常欢迎任何有关此主题的帮助!感谢。

7 个答案:

答案 0 :(得分:8)

让我们从明显的开始:

测试如何工作?在测试驱动的开发中,您首先要考虑要实现的功能,然后为其编写测试。在你给出sum函数的例子中,它应该做的很明显。然后编写一个测试,确保总和有效。

单元测试应尽可能轻量级,以便每次点击构建按钮时都可以运行它们。当您在此示例中执行此操作时,您的测试将失败,因为您尚未实现求和函数。

现在编写实际函数并继续调试和实现,直到测试通过。然后你确定你已经实现了你想要的功能。

现在你应该如何设计测试?你无法测试所有测试,这是不可能的。举个例子,假设你接受用户输入,你必须验证。那么为该验证代码编写至少两个测试用例是很自然的事情:确保有效输入被解析。第二个测试用例获得无效输入,并确保它失败,引发异常或您想要的任何行为。因此,在这种情况下,最好有一个预期通过的肯定测试和一个检查无效输入是否未经过验证的否定测试。

应该何时进行测试?正如我之前提到的,测试应该足够轻量级,以便它们可以在每个构建上运行。是的,运行所有这些。这样可以确保您不会错过代码中的依赖项,这种依赖项会使您远离您编辑的点远离事物。

可以测试任何东西吗?那么,通常依赖外部资源的方法很难测试。我的意思是数据库,网络连接或特定的硬件和驱动程序。它可以完成但是你必须设置一个更大的测试设置。

错误修正和测试如果您正在挤压错误,那么测试变得非常有用的典型场景。当然不是字面意思。如果您有一个需要修复的错误,请先尝试为其编写测试。然后修复代码,直到测试通过。从这一点开始,这个测试“监视你的代码”,这个bug永远不会再回来了。

你通过测试获得了什么?在我看来有很多东西

  1. 更加模块化,易于维护的代码,因为它必须是可测试的
  2. 置信。拥有经过大量测试的代码库可让您确信它按预期工作并保持这样。
  3. 你很早就发现了bug。这意味着您可以更轻松地修复它们。
  4. 习惯使用测试需要一些努力,但我认为这是值得的。特别是如果你正在编写某种类型的库。

答案 1 :(得分:3)

那么, 通常,有三种测试。单元测试,系统测试和QA测试。单元测试,顾名思义,测试小单元 - 单独的函数和类。

对于所有现代开发环境,都有单元测试框架。有针对.net的Nunit,以及Visual Studio中的MS单元测试框架,C ++的CPPUnit,JUnit等等。所有这些都意味着:连接到程序的各个部分,运行预定义的脚本并报告错误。

例如,CPPUnit基于像CPPUNIT_ASSERT_EQUAL这样的宏,意思是用作这样的东西:CPPUNIT_ASSERT_EQUAL(sum(arr),17)。它会说如果它不相等,那么测试将被认为是失败的。

你应该为每个函数开发测试,然后 - 你不怕改变和优化代码。它通常被称为“可重复性” - 能够执行复杂的操作,例如对所有代码库进行全面测试,只需单击一下。

每个模式软件开发都需要进行单元测试,因为经验表明它们可以提高开发速度。还建议单元测试代码可以作为库的一种“文档”。

系统测试是更大,更高级别功能的自动化测试。系统测试的想法是提供干净的输入(例如数据库,用户输入等)来测试整个事物,根据预定义的resutls验证输出。系统输出必须是确定性的,并且仅取决于输入。每次系统更改时,系统测试也会发生变化。

TDD是一个很酷的坏主意,建议你在实现正确的自动化测试之前不要开发任何东西,然后编写代码来满足测试。它被视为失败,因为在开发过程中设计的变化是不可避免的,并且小的设计变更通常会导致单元测试的剧烈变化。

手动QA是最终的,也是最重要的软件测试类型。这个想法是准备一个测试计划,在设计和编码阶段完成,收集开发人员在编写每个if语句时的所有想法,如何实际使这个特定的if语句沿着较不期望的代码路径运行。质量保证人员,能够在没有开发环境的情况下完成任何可以完成的程序,可以遵循最终的测试程序和他们自己的想法,找到更多的错误。

答案 2 :(得分:1)

我发现Kent Beck的书“JUnit Pocket Guide”是一本优秀的(廉价且紧凑!)单元测试的介绍:本书大致分为测试驱动编程和一般测试技术的优点和然后进入JUnit框架的细节(他共同创建)。

http://www.amazon.co.uk/JUnit-Pocket-Guide-Kent-Beck/dp/0596007434/ref=sr_1_7?ie=UTF8&s=books&qid=1276811600&sr=8-7

关于您对单元测试的一些说明性示例的请求;这个JUnit Primer也不错:

http://www.clarkware.com/articles/JUnitPrimer.html#testcase

答案 3 :(得分:1)

你可以将测试划分为三个大分支(实际上还有更多,但如果你是初学者,你必须先了解基础):Alpha,Beta,完整的工作代码。

  1. 在alpha中,您可以为每一段代码尝试每一个值。
  2. 在测试版中,您可以向全世界提供可能正在运行的应用程序,以便从测试人员那里获得反馈并进行改进。
  3. 当您的应用完全正常工作时,您只需等待发现该问题的用户的错误报告(它总是会出现)并使用修补程序进行修复。
  4.   

    当我开发一个函数时,我该如何测试它?例如:使用sum函数时,我应该测试每个输入值还是仅测量一些限制?如何用字符串作为参数测试函数?

    在alpha中,您必须考虑可以拨打代码的所有可能性。 在sum()函数的情况下,它们是少数,但是如果你正在开发让我们说一个大的数据库服务器应用程序,你需要考虑每个可能的输入并处理每个可能的错误,把最终用户想象成一个愚蠢的人甚至是恶意破解者。

      

    在一个大型程序中,我是否必须测试它的每一段代码?当你们编程时,你是否测试了所有编写的代码?

    我知道,你应该,微软不会。 (抓住笑话;))

      

    自动化测试的工作原理以及如何尝试?自动化测试的工具如何运作以及它们的作用是什么?

    没有自动化可以克服人类智能和良好的调试器(这是您真正需要的唯一工具!)

      

    我听说过单元测试。我可以对此作一个简短的解释吗?

    http://en.wikipedia.org/wiki/Unit_testing

      

    什么是测试框架?

    http://en.wikipedia.org/wiki/Test_automation_framework

答案 4 :(得分:1)

测试内容

有一些非常有用的概念帮助我解决了这个问题:

等效分区说“在这个上下文中使用这些事件运行测试等同于此处的其他测试,因此我不需要同时执行这两项测试。”

边界分析说“这是上下文或不同事件的变化导致不同结果的点,所以我希望在这个边界的任何一侧进行测试。”

考虑这些可以真正帮助减少您需要编写的测试数量。

何时测试

我总是手动测试我的代码以确保它有效。我经常写一个额外的单元测试,它涵盖了我即将编写的每一行代码。在我编写代码以使其通过之前,单元测试失败。如果这是用户会做的事情,那么我也经常写一个验收测试或自动场景。

自动化测试

自动化测试意味着编写脚本或记录测试,这样您就不必手动执行 - 您的脚本或代码将为您完成。有两种自动化工具:BDD-或英语可读的验收测试装置,可以让您编写脚本,自动化包装器可以让您更轻松地自动化。例如,您可以选择使用GivWenZen或Fitnesse作为装置,使用Selenium作为Web自动化工具。

如果你有Visual Studio 2008+,你可以从这里下载源代码并尝试使用它来运行它:

http://code.google.com/p/wipflash/

单元测试

在最严格的意义上,单元测试意味着与所有其他代码元素隔离地测试代码元素。我们使用模拟代替我们的Code Under Test所需的真实代码片段。实际上,我们对“单位”的性质经常是务实的 - 例如,我不会嘲笑域对象。

然而,以大多数人使用它的方式进行单元测试并不是真正的测试。大多数情况下,它是一种实现清洁设计和职责分离的机制,因为你试图通过测试它来强迫它。

我喜欢将单元测试视为“编写一个如何使用我即将编写的代码的示例”。该示例恰好位于单元测试框架中并且可执行。

测试框架

  • 单元测试框架可以帮助您一起进行大量测试。
  • 验收测试框架可以帮助您运行更大的场景,并且通常具有英语可读性。
  • 自动化框架通常位于您的英文可读框架下方,可帮助您与应用程序进行交互。
祝你好运!

答案 5 :(得分:1)

开发功能时,应该如何测试?例如:使用求和函数时,我应该测试所有可能的输入值还是仅测试一些限制?用字符串作为参数测试函数怎么样?您可以使用边界值分析黑盒测试类型

在一个大程序中,我是否必须测试它的每一段代码?当你们编程时,您会测试所有编写的代码吗?是的,您必须确认每个模块均按预期结果工作

自动测试的工作原理以及如何进行测试?自动化测试工具如何工作以及它们如何工作?自动化测试取决于不同的因素。项目范围,时间,成本,可用资源等。建议您探索自动化测试概念

我听说过单元测试。我可以对此做一个简短的解释吗? 什么是测试框架? 。取决于您的编程语言选择,因为在python中提供了unittest,而java具有另一个单元测试框架

总体上需要经历自动化测试的概念和应用。

答案 6 :(得分:0)

当我开发一个函数时,我应该如何测试它?例如:在使用 sum 函数时,我应该测试每个可能的输入值还是只测试一些限制?用字符串作为参数测试函数怎么样?

首先定义用于创建测试用例的应用程序的功能。无论您是手动测试还是通过自动化进行测试,您都需要定义您希望在每个输入上实现的输出,以确定测试用例的限制。

在一个大程序中,我是否必须测试它的每一段代码?当你们编写程序时,你会测试每一个编写的代码吗?

测试有时会很费力,因为它是一个需要部分遵循的过程。代码将针对每个定义的功能进行部分测试。但是,如果您正在处理的应用程序具有从过去执行良好的代码中获得代码可重用性的范围,那么可以跳过该部分或通过自动化而不是手动检查代码和输出来处理该部分。

自动化测试的工作原理以及如何进行测试?自动化测试工具的工作原理和作用?

自动化测试通常通过自动化测试工具完成,这些工具用于运行测试代码以检查软件或应用程序。例如,selenium 是一种开源测试自动化工具,可以使用 Web 浏览器自动执行测试。它为您提供了使用各种编程语言(Ruby、Java、NodeJS、PHP、Perl、Python 和 C#)为不同浏览器和操作系统编写测试脚本的接口。

我听说过单元测试。我可以对此做一个简短的解释吗?

单元测试是一种测试实践,其中测试软件的各个功能。单元测试的主要目的是检查应用程序的每个单元或最小功能,通常涉及一个或几个导致共同输出的输入。

什么是测试框架?

测试框架是测试应用程序、软件或网站所遵循的工具和程序的组合。简而言之,它是一套设计测试用例的规则。