Questions tagged «unit-testing»

单元测试是一种测试源代码的各个单元以确定它们是否适合使用的方法。

3
匿名名称空间使代码不可测试
这是典型的C ++代码: foo.hpp #pragma once class Foo { public: void f(); void g(); ... }; foo.cpp #include "foo.hpp" namespace { const int kUpperX = 111; const int kAlternativeX = 222; bool match(int x) { return x < kUpperX || x == kAlternativeX; } } // namespace void Foo::f() { ... …
12 c++  unit-testing 

3
单元测试使用DI的类而无需内部测试
我有一个在1个主要班级和2个较小的班级中重构的班级。主要类使用数据库(就像我的许多类一样)并发送电子邮件。因此,主要类别有一个IPersonRepository和一个IEmailRepository注入,后者又将其发送给2个较小的类别。 现在,我想对主类进行单元测试,并且学会了不对类的内部工作进行单元测试,因为我们应该能够在不破坏单元测试的情况下更改内部工作。 但作为类使用IPersonRepository和IEmailRepository,我HAVE指定一些方法为(模拟/虚拟)的结果IPersonRepository。主类基于现有数据计算一些数据并将其返回。如果要测试,我不知道如何在不指定IPersonRepository.GetSavingsByCustomerId返回值x的情况下编写测试。但是,然后我的单元测试“知道”内部工作原理,因为它“知道”了哪些方法可以模拟,哪些方法不可以。 如何在不了解内部原理的情况下测试已注入依赖项的类? 背景: 以我的经验,像这样的许多测试会为存储库创建模拟,然后为模拟提供正确的数据,或者测试执行期间是否调用了特定方法。无论哪种方式,测试都会了解内部信息。 现在,我已经看到了有关理论的演示文稿(我以前已经听说过),即测试不应该知道实现的知识。首先,因为你不是测试如何它的工作原理,而且还因为当你改变现在所有的单元测试失败,因为他们“知道”关于落实执行。尽管我喜欢测试的概念不了解实现的概念,但我不知道如何实现。

2
测试与规格之间的差异
我现在有一个概念问题,我找不到有关Test(UnitTest等)与Spec(Rspec等)之间的差异的任何信息。 据我所知,规范包含在集成测试中,而测试包含在UnitTest中,仅此而已。 你能解释一下有什么区别吗?

2
为什么单元测试属性通常需要公共方法?
我最近注意到,不尊重在.NET程序集中的受保护方法中添加[TestInitialize],但是如果我将该方法公开,则它会被单元测试运行程序(在这种情况下为Resharper)调用。我过去用测试方法已经注意到了这几次。 从技术上讲,它就像公开方法一样容易反映在私有方法上。实际上,反射是一种用于对私有方法进行单元测试的方法。 那么,为什么我需要公开我所有的单元测试方法?

3
单元测试比赛
我的雇主每月举行一次单元测试日比赛。一整天专门用于编写单元测试-显然,我们每个月都要进行更多测试,但这是一整天-竞赛的“优胜者”将获得奖励。但是,我们发现很难确定谁是赢家。 我们为每个测试用例分配点。因此,如果您编写了这样的单元测试... for (int i = 0; i < 100; i++) { assertTrue(i*i, square(i)); } 您将获得100分。显然,这是一个简单的示例,但是它演示了为每个测试用例分配“点”的问题。 我们主要是一家Java&Javascript商店。因此,我建议将经过测试的代码分支数量作为度量标准。我们可以轻松地通过代码覆盖率工具(例如EclEmma)来计算测试的分支。但是,不确定如何通过Selenium测试以及如何在Javascript源代码覆盖方面做到这一点(有什么想法吗?) 有谁对我们如何更好地确定本次比赛的获胜者有任何建议? 编辑 我知道如何编写单元测试,我知道如何编写有效的单元测试,不需要帮助确定要测试的内容。我无法控制这场比赛-比赛将继续进行。因此,我要么添加一些输入以使其更好,要么继续进行测试游戏(是的,我进行游戏。当然,我进行游戏。有奖品可以赢得) 编辑 这个问题在这里显然是不重复的,但它包含有关如何找到好的测试用例有用的信息,它没有提供任何有用的指标来评估的竞争。

2
您如何对ETL和报告项目进行单元测试\使用TDD方法?
ETL项目是使用诸如SSIS,PowerCenter等ETL(提取-转换-加载)工具创建的项目。 这些通常涉及从外部源读取数据,将其加载到暂存数据库,执行某些转换并将其加载到最终数据库。 一个简单的例子是使用SSIS来读取教师使用SSIS提供的excel文件并将其加载到数据库中。然后编写存储过程或更多SSIS包以计算每个学生的成绩并将该数据加载到数据集市\仓库中 然后,您在集市上构建存储过程以生成输出,报告工具(SSRS \ Excel \ etc)使用该输出来生成可视化。 我试图了解在这种情况下如何执行TDD和适当的单元测试。ETL的测试主要是确保登台表中加载的数据与源中数据的正确子集匹配。因此,对其进行测试将导致实现ETL的迷你版本。报告SP的输出取决于表本身中的数据,因此即使没有创建包含清理的测试数据的数据库,也没有维护的噩梦就无法拥有稳定的输出数据集。 例: 冲刺1:学生表包含姓名,年龄,年级 您为此表创建测试数据,并基于该表进行单元测试 冲刺2:性别字段添加到表中。 现在,如果刷新学生字段中的数据以填充性别属性,则由于数据已更改,因此测试用例将无效。如果您不这样做,就无法创建需要性别列的测试用例
12 unit-testing  sql  tdd 

4
有比一系列“ AssertEquals”更好的编写单元测试的方法吗?
这是使用qunit进行单元测试的基本示例: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <link rel="stylesheet" href="qunit/qunit-1.13.0.css"> <script src = "qunit/qunit-1.13.0.js"></script> <script src = "../js/fuzzQuery.js"></script> <script> test("Fuzz Query Basics", function() { equal(fuzzQuery("name:(John Smith)"), "name:(John~ Smith~)"); equal(fuzzQuery("name:Jon~0.1"), "name:Jon~0.1"); equal(fuzzQuery("Jon"), "Jon~"); //etc } ); </script> </head> <body> <div …

1
Django中的单元测试
我真的很难为一个大型Django项目编写有效的单元测试。我具有相当好的测试覆盖范围,但是我已经意识到,我一直在编写的测试绝对是集成/验收测试,而不是单元测试,而且我的应用程序中有关键部分没有得到有效测试。我想尽快解决此问题。 这是我的问题。我的模式是深层的关系,并且非常注重时间,这给我的模型对象带来了很高的内部耦合和很多状态。我的许多模型方法都是基于时间间隔进行查询的,而在带有auto_now_add时间戳的字段中,我有很多事情要做。因此,以如下所示的方法为例: def summary(self, startTime=None, endTime=None): # ... logic to assign a proper start and end time # if none was provided, probably using datetime.now() objects = self.related_model_set.manager_method.filter(...) return sum(object.key_method(startTime, endTime) for object in objects) 一种方法如何测试这样的东西? 这是我到目前为止的位置。在我看来,应该对单元测试目标的参数进行一些模拟行为by key_method,是否summary正确地过滤/聚合以产生正确的结果? 模拟datetime.now()很简单,但是我如何模拟其余的行为呢? 我可以使用固定装置,但是我听说过使用固定装置构建数据的利弊(可维护性差是我的主意)。 我也可以通过ORM设置数据,但这可能是有局限性的,因为那时我还必须创建相关的对象。而且ORM不允许您auto_now_add手动处理字段。 模拟ORM是另一种选择,但是模拟深度嵌套的ORM方法不仅棘手,而且ORM代码中的逻辑也从测试中被模拟出来,而模拟似乎使测试真正依赖于内部和内部依赖。被测功能。 最难破解的螺母似乎是这样的功能,它们位于几层模型和较低级别的功能上,并且非常依赖于时间,即使这些功能可能并不十分复杂。我的总体问题是,无论我如何看待它,我的测试看起来都比它们要测试的功能复杂得多。

5
唯一的逻辑是警卫的单元测试方法是否有用?
说我有一个这样的方法: public void OrderNewWidget(Widget widget) { if ((widget.PartNumber > 0) && (widget.PartAvailable)) { WigdetOrderingService.OrderNewWidgetAsync(widget.PartNumber); } } 我的代码中有几种这样的方法(异步Web服务调用的前半部分)。 我正在辩论将它们包含在单元测试中是否有用。是的,这里有逻辑,但这只是保护逻辑。(这意味着在允许进行Web服务调用之前,请确保已拥有所需的东西。) 我有一部分说“确保可以对它们进行单元测试,但这不值得花时间”(我在一个已经落后于进度的项目中)。 但是我的另一面说,如果您不对它们进行单元测试,并且有人更换了Guards,那么可能会有问题。 但是我的第一部分说,如果有人更换了警卫,那么您将为他们做更多的工作(因为现在他们必须更换警卫和警卫的单元测试)。 例如,如果我的服务承担检查Widget可用性的责任,那么我可能不再想要那个守护者。如果正在单元测试中,我现在必须更改两个位置。 我在两种方式上都有利弊。所以我想问一下别人做了什么。
12 c#  unit-testing 

2
所有单元测试都在一个可执行文件中,还是将它们拆分?
在为一个软件(例如一个库)编写测试时,您是希望将所有单元测试编译为一个,还是将它们分为几个可执行文件? 我问的原因是因为我当前正在使用CUnit来测试正在使用的库。这些测试被分为独立的套件,这些套件被编译成一个可执行文件,并带有打印输出以表示失败。现在,该库的构建系统是CMake(尽管它的名称不多,但与CUnit无关),它带有自己的测试框架CTest。CTest允许我注册用作测试的可执行文件列表。 我正在考虑是否使用CTest进行自动化测试。但是,这将需要我将到目前为止编写的测试分成单独的编译目标。否则,我不能真正利用CTests的某些高级功能,例如有选择地运行测试。 我意识到这更多是关于使用哪种工具以及它们的处理方式和约定的问题,但是除此之外,还有其他原因更倾向于使用单个测试可执行文件而不是单独的测试可执行文件吗?或相反亦然?


3
用Javascript应该测试什么?
在工作中,我们刚刚开始使用基于Javascript的大量应用程序(实际上仍在使用Coffeescript,但仍在使用),我一直在使用JsTestDriver和fabric来实现自动化测试系统。 我们从来没有用这么多的Javascript编写任何东西,所以到目前为止,我们从未进行过任何Javascript测试。我不确定在单元测试中到底应该测试什么。我们已经为各种事物编写了JQuery插件,因此很明显,应该使用JsTestDriver尽可能多地验证它们的正确性,但是我们团队中的其他所有人似乎都认为我们也应该测试页面级Javascript。 我认为我们不应该将页面级Javascript作为单元测试进行测试,而应该使用Selenium之类的系统来验证一切是否按预期进行。我这样做的主要理由是,目前确保页面级Javascript测试通过JsTestDriver失败,因为它们正在尝试访问DOM上可能不存在的元素。 那么,应该使用Javascript对哪些内容进行单元测试?

8
许可单元测试是否有意义?
我想知道(不)在主要由单元测试组成的测试代码上放一个许可证是否有任何好处/风险?你怎么看? 我对(L)GPL,Apache,MIT和BSD下的许可特别感兴趣。 编辑:假设非测试代码已经根据某种许可证发布,但是测试代码尚未发布,因此问题是是否发布它,以及是否发布相同的许可证。

4
渐进式依赖注入方法
我正在使用依赖注入使我的课程可单元测试。但是其中一些类有很多客户端,而且我还没有准备好重构所有这些类以开始传递依赖项。所以我正在努力逐步做到;暂时保留默认依赖关系,但允许对其进行覆盖以进行测试。 我正在考虑的一种方法是将所有“新”调用移入它们自己的方法,例如: public MyObject createMyObject(args) { return new MyObject(args); } 然后,在我的单元测试中,我可以继承该类的子类,并覆盖create函数,以便由它们创建伪造的对象。 这是一个好方法吗?有什么缺点吗? 更一般而言,只要您可以替换它们以进行测试,就可以使用硬编码的依赖项吗?我知道首选方法是在构造函数中明确要求它们,而我希望最终到达那里。但是我想知道这是否是一个好的第一步。 我刚想到的一个缺点是:如果您有需要测试的真实子类,则无法重用为父类编写的测试子类。您必须为每个真实的子类创建一个测试子类,并且它必须覆盖相同的create函数。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.