问题标签 [dunit]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
unit-testing - 使用 Bold for Delphi 框架进行编码时提高可测试性
背景 我在一个由 7 名开发人员和 2 名测试人员组成的团队中工作,负责物流系统。我们使用 Delphi 2007 和模型驱动开发,使用Bold for Delphi作为框架。该系统已经投入生产大约 7 年,拥有大约 170 万行代码。我们在 4-5 周后发布到生产环境,几乎每次发布后,我们都必须为我们没有发现的错误做一些补丁。这对我们和客户来说当然是令人恼火的。
当前测试 解决方案当然是更自动化的测试。目前我们有手动测试。以空数据库开始并从建模方法添加数据的 Testdbgenerator。我们还有Testcomplete,它运行一些非常基本的脚本来测试 GUI。时间不足使我们无法添加更多测试,但脚本对应用程序的更改也很敏感。几年前,我真的尝试过使用 DUnit 进行单元测试,但几天后我放弃了。这些单元的连接太强了。
单元测试先决条件 我想我知道单元测试的一些先决条件:
- 编写做一件事的小方法,但要把它做好。
- 不要重复自己。
- 首先编写失败的测试,然后编写代码使测试通过。
- 单元之间的连接应该是松散的。他们应该不太了解对方。
- 使用依赖注入。
使用框架 我们可能会升级到 Delphi XE2,主要是因为 64 位编译器。我对Spring进行了一些研究,但这需要从 D2007 进行更新,而且现在不会发生。或许明年。
问题 大多数代码仍未自动测试。那么提高旧代码的可测试性的最佳途径是什么?或者最好只为新方法编写测试?我不确定增加自动测试的最佳方法是什么,欢迎对此发表评论。我们可以时不时使用 D2007 + DUnit,然后稍后轻松更改为 Delphi XE2 + Spring 吗?
编辑:关于手动测试的当前测试方法,正如克里斯所说的那样,只是“重击并尝试打破它”。
delphi - 如何自定义测试用例向导生成的 DUnit 测试用例类?
在Delphi安装的文件中四处寻找后,我找到了一个文件
“C:\Program Files\Embarcadero\RAD Studio\7.0\ObjRepos\en\UnitTestFrameworks.xml”
该文件有许多用于设置选项的部分,这些选项会影响由测试用例向导生成的测试用例代码,当您创建新的测试用例单元时会调用该测试用例向导。这些选项中的大多数都是不言自明的,但很高兴看到一些文档。
特别是,我想:
添加第二个 TestClassComment。
在向导的测试用例基类组合框中有多个选项。我可以通过更改 UnitTestFrameworks.xml 文件中节点的值来更改此列表中单个项目的值,但无法让多个项目出现在列表中。
用一些属性标记测试类和方法。
目前我只关注 Delphi Win 32 的个性。
我在正确的轨道上吗?文档是否可用或失败,有没有人有任何提示?
unit-testing - 如何打破依赖以启用单元测试
我花了很多时间思考单元测试。我至少已经购买了有效地使用旧代码作为电子书。其中大部分是有道理的,这似乎是一本关于对旧代码进行单元测试的好书。但我仍然认为我需要一个起点,因为我们的项目 Attracs 很大。另请参阅我关于单元测试的一般问题。
该应用程序有一个 UML 模型来定义类、属性和关系,并为 Delphi 使用 Bold。在模型中的每次更改之后,我们都会进行一次往返。这会自动为文件 businessclasses.pas 和 BusinessClasses_Interface.inc 中的方法生成声明。如果更改需要更改数据库,也会生成一个 SQL 脚本。这多年来一直运作良好,但我们从未使用过任何单元测试。
所以我添加了一个新的testproject,然后依赖关系引起了麻烦。我有
[DCC 错误] Attracs_Interface_Uses.inc(10):F1026 找不到文件:“MsxSupport.dcu”
所以总结一下错误
AttracsTest.dpr 使用
BusinessClasses.pas 使用
BusinessClasses_Interface.inc 使用
Attracs_Interface_Uses.inc
那么我怎样才能打破依赖链呢?
请注意,实际上文件要大得多。模型中有 300 多个类,businessClasses.pas 有超过 53000 行代码...作为测试用例,我只有 TPerson 类和 AddResponsibility 方法。但是你应该明白其中的原理。
这是我的文件:
吸引测试.dpr
TestBusinessClasses.pas
Attracs_Interface_Uses
BusinessClasses_Interface.inc
商务舱.pas
个人公司
delphi - DUnit 测试层次结构
目前我在 DUnit 中使用 2 级测试层次结构(测试项目 -> 测试用例 -> 测试方法;参见下面的示例)。是否可以引入第三级甚至更多级?
delphi - 我可以在 DUnit 中编写“参数化”测试吗
我正在使用 DUnit 来测试一个 Delphi 库。我有时会遇到一些情况,我编写了几个非常相似的测试来检查一个函数的多个输入。
有没有办法在 DUnit 中编写(类似于)参数化测试?例如,为合适的测试过程指定输入和预期输出,然后运行测试套件并获得关于测试的多次运行中哪一次失败的反馈?
(编辑:一个例子)
例如,假设我有两个这样的测试:
我可能有更多这样的测试,它们做的事情完全相同,但输入和期望不同。我不想将它们合并到一个测试中,因为我希望它们能够独立通过或失败。
delphi - DUnit GUI 测试:我可以将“应用程序”强制转换为不同的“表单”吗?
我正在尝试使用 DUnit 对其主窗体为其自身创建动态框架的应用程序运行 GUI 单元测试。我已经能够将应用程序测试的主窗体创建为测试用例中的窗体并访问其菜单项等。
当应用程序尝试动态创建框架时,问题就出现了。框架的资源读取达到需要窗口句柄的程度(在我的情况下,设置选项卡表的标题)。这里它从 TWinControl.GetHandle 到 TWinControl.CreateWnd 和 TCustomFrame.CreateParams。
在这个 CreateParams 中,代码说:
这就是差异发生的地方。当我运行实际的应用程序(不在测试中)时,这里的 Application.Handle 返回一个非零数字,并且流程继续正常。但是在 DUnit 测试应用程序中,这里的 Application.Handle 返回 0。这会导致 TWinControl.CreateWnd 中的代码引发异常,告知框架没有父框架:
我想尝试解决这个问题(通常是所有测试问题),而不是仅仅因为测试而修改“生产”代码。您能否提供任何线索,说明我是否可以以某种方式将“应用程序”强制为其他东西,或者以其他方式解决这个问题?
查看代码,可能的其他解决方法方案可能是尝试让所有者(这是我要测试的应用程序的“MainForm”,即我想要获得的句柄)在执行时处于 csReading 状态这个框架在测试中创建,但至少最初看起来也不是那么简单。
delphi - (如何)我可以将 FutureWindows 与标准文件打开对话框一起使用吗?
我一直在尝试使用 tomazy 的 FutureWindows 基础架构(请参阅他在Delphi GUI Testing and Modal Forms上的回答或https://github.com/tomazy/DelphiUtils上的工具主页),但想知道是否以及如何可以它可以与标准的 Windows 文件打开对话框一起使用吗?它们似乎不是从 TControl 继承的,FutureWindows infra 似乎假设了它(除非我误解了它)。
我想做的基本上只是在 OpenFileDialog 中选择一个文件,该文件由我的测试中的命令以模态方式打开,但还没有弄清楚如何做到这一点。
delphi - Delphi中用于单元测试的HTTP服务器
我需要在我的 Delphi 应用程序中测试一些 HTTP 组件。我使用 DUnit 并希望在测试中添加一些自动化。
所以我的测试代码需要启动本地 HTTP 服务器,配置它(例如,准备在 3 秒内断开连接,或模拟低带宽,或要求登录/密码等),运行我的单元测试并关闭 HTTP服务器。
是否有一些 HTTP 服务器完全可用于 Delphi/DUnit?
我知道Mozilla团队有这样的服务器,但是将它集成到DUnit中并不容易。
delphi - TIdHTTPServer 在我的 DUnit 测试中激活它时引发 EThread 错误 6
我需要一个本地 HTTP 服务器来进行单元测试。
当我尝试在 处激活 TIdHTTPServer 时SetUp
,它会失败并显示 EThread 消息:
“线程错误:描述符无效 (6)”
这就是我初始化它的方式:
也许使用 Indy 的 TIdHTTPServer 和 DUnit 框架有一些限制?
- 德尔福 2010
- 印地 10
TIdListenerThread.Run
在proc(IdCustomTCPServer 单元)的这一行之后的某处引发了异常
但是,我无法更深入地追踪它,我不知道为什么。
delphi - 在 TeamCity 上运行时,模式窗口关闭的 DUnit GUI 测试挂起
我一直在尝试使用 DUnit 进行 GUI 测试,其中包括通过 @tomazy 的消息循环计时器系统与模式窗口进行交互(有关更多详细信息,请参阅我之前的问题:(如何)我可以将 FutureWindows 与标准文件打开对话框一起使用吗?)。
当我手动运行测试时,我在另一个问题中的解决方案工作正常,但是当我在 TeamCity 的连续构建系统中运行它时,它会在应该处理对话框的 OK 消息时挂起。运行测试的服务设置了“与桌面交互”权限,并且我已经验证只有在按下 OK 时才会发生挂起(即发生 CDN_FILEOK 通知)。我可以使用 WM_CLOSE 关闭对话框,但这自然不会导致对话框返回 OK 模态结果,因此不可用。
如果我不能让它工作,我可能不得不修改生产代码(测试目标)以发布一个事件以提供文件名并将测试挂钩放入其中并在没有对话框的情况下提供它,但我'想知道是什么导致了这个问题,当然最好在不修改生产代码的情况下解决它。