自我测试系统

时间:2008-09-13 11:09:54

标签: unit-testing language-agnostic

我有一个想法,我正在和一些同事一起考虑。我们当中没有人知道它是否存在。

基本前提是拥有一个100%正常运行时间但可以动态提高效率的系统。

  

以下是方案:

*所以我们快速将系统哈希到a   它具有指定的接口集   零优化,但我们是   确信它是100%稳定的   虽然(可疑,但为了   这个场景请玩   沿着)

*我们然后介绍   原来的课程,并开始   程序替换为   瓶颈。

  *原始和替换同时启动   同步。

  *原件允许运行完成:如果更换没有   完成它被系统否决了   作为替代品   原来,

  *对于a,替换必须始终返回与原始值相同的值   指定的次数,并为   特定范围的值,之前   被采纳为替代   原来,

  *如果在采用更换后发生异常,则系统   自动尝试相同的操作   有一个类被取代了   它。


您是否在实践中看到了类似的概念? Critique Please ...

  

以下是有关初步问题后的评论   帖子:

  *系统演示了达尔文的系统演化方法。

  *原件和替换件将并行运行而不是串联。

  *竞争条件是多线程应用程序和我的固有问题   承认他们。

6 个答案:

答案 0 :(得分:3)

我认为这个想法是一个有趣的理论辩论,但由于以下原因不太实际:

  1. 为了确保新版本的代码运行良好,您需要进行卓越的自动测试,这是一个很难实现的目标,也是许多公司无法开发的目标。只有在进行了这种自动测试后,您才能继续实施该系统。
  2. 这个系统的重点在于性能调整,即 - 代码的特定版本被取代其性能的版本所取代。对于今天的大多数应用,性能不太重要。意思是,大多数应用程序的整体性能是足够的 - 只要想一想,你可能很少发现自己抱怨“这个应用程序非常慢”,而你通常会发现自己抱怨缺乏特定功能,稳定性问题,UI问题等即使你抱怨速度缓慢,通常也会导致系统整体变慢,而不仅仅是特定的应用程序(当然也有例外)。
  3. 对于性能是一个大问题的应用程序或模块,改进它们的方法通常是识别瓶颈,编写新版本并首先独立于系统进行测试,使用某种基准测试。当然,对整个应用程序的新版本进行基准测试也可能是必要的,但总的来说,我认为这个过程只会发生很少次(遵循20%-80%的规则)。在这些情况下“手动”执行此过程可能比所描述的系统更容易且更具成本效益。
  4. 添加功能,修复与性能无关的错误等时会发生什么?您没有从系统中获得任何好处。
  5. 结合运行这两个版本来比较他们的表现有比你想象的更多的问题 - 不仅你可能有竞争条件,但如果输入不是一个合适的基准,你可能得到错误的结果(例如,如果你获取大量小数据包,这是输入为大数据包的90%时间。此外,它可能是不可能的(例如,如果实际代码更改了数据,则无法同时运行它们。)
  6. 这听起来很有用并且实际上是“必须”的唯一“环境”是一个“遗传”系统,它自己生成新版本的代码,但这是一个完全不同的故事,并没有真正广泛适用......

答案 1 :(得分:2)

在运行时运行性能基准测试的系统将比没有运行的系统慢。如果目标是优化速度,为什么你不能独立进行基准测试并在证明速度更快后导入最快的例程?

您同时启动例程的想法可能会引入race conditions

此外,如果目标是确保100%正常运行时间,则您不希望引入未经测试的例程,因为它们可能会生成无法捕获的异常。

也许你的想法有利于作为基准测试而不是操作系统?

答案 2 :(得分:2)

我在练习中看到过类似的概念吗?不,但无论如何我会提出一个方法。

似乎您的大部分目标都会通过某种超级源控制系统来满足,可以使用CruiseControl来实现。

CruiseControl可以运行单元测试以确保新版本的正确性。

您必须编写一个CruiseControl构建器pluggin,它将根据一系列现有基准执行您的系统的新版本,以确保新版本是一项改进。

如果CruiseControl构建循环通过,则接受新版本。这样的过程需要付出相当大的努力来实施,但我认为这是可行的。单元测试和基准构建器必须非常光滑。

答案 3 :(得分:2)

我认为像OSGi或Spring这样的控制容器反转可以完成您所谈论的大部分内容。 (按名称动态加载)

你可以建立在他们的东西之上。然后实现您的代码

  1. 将工作单位划分为离散的模块/类(策略模式)
  2. 按唯一名称标识每个模块并将功能与其关联
  3. 当请求模块时,它是按功能请求的,并且随机使用其中一个具有该功能的模块。
  4. 保持性能统计(在执行前后获取系统滴答并存储结果)
  5. 如果发生异常,请将该模块标记为不使用并记录异常。
  6. 如果模块通过消息传递完成工作,则可以存储消息,直到操作成功完成,并在发生异常时重新使用另一个模块。

答案 4 :(得分:1)

有关高可用性系统的设计思路,请查看Erlang。

答案 5 :(得分:0)

我认为代码本身并不会变得更好。但是,一些运行时参数可以很容易地调整到最佳值,但这只是常规编程,对吧?

关于即时更改,我分享了想法,并将在Lua或类似的动态语言之上构建它。可以有部件加载,如果更换,则重新加载使用。也没有火箭科学。如果“旧代码”仍在运行,那就完全可以了,因为与DLL不同,只有在读取文件时才需要该文件,而不是在执行来自那里的代码时。

有用? NAA ...