Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing 软件层的自诊断测试?_Testing_Diagnostics_Automated Tests - Fatal编程技术网

Testing 软件层的自诊断测试?

Testing 软件层的自诊断测试?,testing,diagnostics,automated-tests,Testing,Diagnostics,Automated Tests,随着越来越多的人致力于将软件划分为独立的层,并使用动态发现和依赖项注入将它们解耦,越来越难确定系统中的哪个“层”导致了“应用程序”的全系统故障 单元测试有助于确保组成层的所有“模块”按预期工作。但是单元测试是以这样一种方式编写的,即通过使用存根和模拟等技术来隔离每个“模块” 考虑下面这个简单的例子: L1。数据库->L2。数据库层->L3。Windows服务->L4。客户端应用程序 例如,如果数据库引擎关闭,则系统将无法正常运行。很难判断数据库引擎是否真的关闭了,或者数据库层(L2)代码中是否存

随着越来越多的人致力于将软件划分为独立的层,并使用动态发现和依赖项注入将它们解耦,越来越难确定系统中的哪个“层”导致了“应用程序”的全系统故障

单元测试有助于确保组成层的所有“模块”按预期工作。但是单元测试是以这样一种方式编写的,即通过使用存根和模拟等技术来隔离每个“模块”

考虑下面这个简单的例子:

L1。数据库->L2。数据库层->L3。Windows服务->L4。客户端应用程序

例如,如果数据库引擎关闭,则系统将无法正常运行。很难判断数据库引擎是否真的关闭了,或者数据库层(L2)代码中是否存在错误。要进行检查,您必须启动某种数据库管理工具来检查数据库引擎是否正在运行

我们试图实现的是一个开发人员工具,可以在系统出现“问题”时启动,该工具将“查询”每个层的“完整性”或“诊断”数据。该工具将提供软件层列表及其“完整性状态”。然后,它将能够立即说,层X是问题的原因(即数据库引擎关闭)

当然,每个层将负责提供自己的“诊断方法”,该工具可以查询这些方法

我想我们试图实现的是某种“集成测试”框架或类似的东西,可以在运行时使用(而不是像单元测试那样的编译/构建时)。灵感来自于具有自己的“车载诊断”功能的物理设备,如汽车。软件世界中的一个很好的例子是每次打开计算机时运行的开机自检


有人看到或听到过类似的事情吗?任何建议或指点肯定会有很大帮助

您可以有一个公共接口,每一层都将作为WCF服务实现。通过这种方式,您可以连接到每一层并对其进行诊断。提供此诊断可能很有用,但如果您想在任何地方(每一层)实现它,则可能会出现另一个失败的情况—您将如何诊断它?您的系统将大量使用WCF服务,这并不好,因为它需要大量维护,并使其不太稳定。另外,它需要大量的工作来实现

我建议的另一种选择是建立一个良好的日志系统。最低要求是让每个模块在所有
catch
部分中记录一个错误,但我建议更多,尤其是为了调试目的。我建议使用Log4Net,它是免费的,而且非常灵活。它在不需要日志记录时非常有效,这意味着您可以将日志记录级别设置为高,即使在生产代码中也不会影响性能。您可以在运行时通过更改配置文件中的设置来更改日志记录级别。我经常使用Log4Net,而且效果很好


一旦你有了你的代码日志,你就可以配置Log4Net,这样所有的日志都会进入一个中央数据库。然后,您将有一个相对容易诊断发生了什么、发生了什么故障、异常或消息在哪里以及是什么的地方。您甚至可以设置电子邮件消息,以便在出现问题时发送。

您可以有一个公共接口,每一层都将作为WCF服务实现。通过这种方式,您可以连接到每一层并对其进行诊断。提供此诊断可能很有用,但如果您想在任何地方(每一层)实现它,则可能会出现另一个失败的情况—您将如何诊断它?您的系统将大量使用WCF服务,这并不好,因为它需要大量维护,并使其不太稳定。另外,它需要大量的工作来实现

我建议的另一种选择是建立一个良好的日志系统。最低要求是让每个模块在所有
catch
部分中记录一个错误,但我建议更多,尤其是为了调试目的。我建议使用Log4Net,它是免费的,而且非常灵活。它在不需要日志记录时非常有效,这意味着您可以将日志记录级别设置为高,即使在生产代码中也不会影响性能。您可以在运行时通过更改配置文件中的设置来更改日志记录级别。我经常使用Log4Net,而且效果很好

一旦你有了你的代码日志,你就可以配置Log4Net,这样所有的日志都会进入一个中央数据库。然后,您将有一个相对容易诊断发生了什么、发生了什么故障、异常或消息在哪里以及是什么的地方。您甚至可以设置在出现问题时发送电子邮件