首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >科学计算库的单元测试

科学计算库的单元测试
EN

Software Engineering用户
提问于 2013-02-26 13:42:51
回答 1查看 2.3K关注 0票数 21

我以前有过一些单元测试的经验,我称之为(不是贬义的)经典的软件工程项目: MVC,带有用户GUI,数据库,中间层的业务逻辑等等。现在我正在用C#编写一个科学的计算库(是的,我知道C#太慢,使用C,不要重新发明轮子,所有这些,但是我们有很多人在我的C#教职员工中做科学计算,我们有点需要它)。就软件开发行业而言,这是一个很小的项目,因为我主要是自己编写的,有时还会得到几位同事的帮助。而且,我没有得到报酬,最重要的是,这是一个学术项目。我的意思是,我希望有一天它会有专业的质量,因为我计划开放源码,希望有足够的时间,它将成长为一个社区的开发人员。

不管怎么说,这个项目正在变得越来越大(大约18,000行代码,我认为这对于一个人的项目来说是很大的),而且它已经超出了我的控制范围。我正在使用git进行源代码管理,我认为我做得很好,但我的测试就像老派一样,我的意思是,编写完整的控制台应用程序来测试系统的很大一部分,主要是因为我不知道如何在这个场景中进行单元测试,尽管我觉得这是我应该做的。问题是,库中包含的大多数算法,例如图算法、分类器、数值求解器、随机分布等等。我只是不知道如何为每种算法指定微小的测试用例,而且由于其中许多算法都是随机的,所以我不知道如何验证正确性。例如,在分类方面,有一些度量标准,如精确性和召回性,但是这些度量更适合于比较两种算法,而不是用于判断单个算法。那么,我如何在这里定义正确性呢?

最后,还存在性能问题。我知道这是一组完全不同的测试,但性能是科学工具的重要特性之一,而不是用户满意度或其他软件工程度量标准。

我最大的问题之一是数据结构。我对kd树的唯一测试是压力测试:插入大量随机向量,然后执行大量随机查询,并与简单的线性搜索进行比较。表演也是一样。对于数值优化器,我有一个基准函数,我可以测试,但是,这是一个压力测试。我不认为这些测试可以归类为单元测试,最重要的是,持续运行,因为大多数测试都相当繁重。但是我也认为这些测试需要完成,我不能只插入两个元素,弹出根,是的,它适用于0-1-n的情况。

那么,如果有的话,这种软件的(单元)测试方法是什么?以及如何围绕代码构建-提交-集成周期组织单元测试和重测试?

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2013-02-26 14:07:30

我想说的是,科学计算实际上非常适合单元测试。您有明确的输入和输出,明确定义的预置和后置条件,很可能不会根据某些设计师的想法每隔一周改变一次,也没有难以测试的UI要求。

您可以列出一些可能造成麻烦的元素;下面是如何处理它们的方法:

  • 随机算法:有两种可能性。如果您实际上想测试随机化本身,只需安排大量的重复,并断言期望的比例的情况符合预期的标准,有足够大的误差空间,虚假的测试失败将是非常罕见的。(不可靠地向幻象错误发出信号的测试套件比没有发现所有可能的缺陷的测试套件要糟糕得多。)或者,使用可配置的随机源,并通过依赖注入将系统时钟(或您使用的任何时钟)替换为确定性源,这样您的测试就完全可以预测了。
  • 算法只从精确/召回的角度定义:没有什么能阻止你输入一套完整的输入用例,并通过把它们全部加起来来测量精度和回忆;这只是一个半自动地高效生成这样的测试用例的问题,这样提供测试数据就不会成为你工作效率的瓶颈。或者,指定一些明智地选择的输入/输出对,并断言算法精确地计算了所需的输入,如果例程足够可预测,也可以工作。
  • 非功能性需求:如果规范确实给出了明确的空间/时间要求,那么基本上必须运行整个输入/输出对套件,并验证资源使用是否大致符合所需的使用模式。这里的诀窍是首先校准您自己的测试类,这样您就不会测量出十个不同大小的问题,这些问题的速度太快,无法测量,或者运行测试套件所花费的时间太长,变得不切实际。您甚至可以编写一个小型用例生成器来创建不同大小的测试用例,具体取决于它运行的速度。
  • 快速和缓慢运行的测试:无论是单元测试还是集成测试,您通常都会得到很多非常快的测试和一些非常慢的测试。由于定期运行您的测试非常有价值,所以我通常采用务实的方法,将所有我拥有的测试分离到一个快速和缓慢的套件中,这样快速测试就可以尽可能频繁地运行(当然是在每次提交之前),而且也不关心两个测试在“语义上”是否应该在一起。
票数 24
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/188442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档