科学计算库的单元测试
我以前在单元测试中有过一些经验,我称之为(不是贬义)经典的软件工程项目:MVC,带有用户GUI,数据库,中间层的业务逻辑等。现在,我我用C#编写了一个科学计算库(是的,我知道C#太慢了,使用C,不要重新发明轮子,所有这些,但是我们有很多人在C#中从事科学计算,我们有点需要)。就软件开发行业而言,这是一个小项目,因为我主要是自己写这篇文章,有时是在一些同事的帮助下编写的。另外,我并没有为此获得报酬,最重要的是,这是一个学术项目。我的意思是,我希望它有一天能达到专业水平,因为我正计划开源。 无论如何,该项目正在变得越来越庞大(大约18,000行代码,对于一个人的项目而言,我认为这是很大的),而且它也变得一发不可收拾。我正在使用git进行源代码控制,我认为我还不错,但是我正在像老派一样进行测试,我的意思是编写编写测试系统大部分内容的完整控制台应用程序,主要是因为我不知道如何在这种情况下进行单元测试,尽管我认为那是我应该做的。问题在于该库主要包含算法,例如图算法,分类器,数值解算器,随机分布等。我只是不知道如何为每种算法指定微小的测试用例,因为其中很多是随机的,我不知道如何验证正确性。例如,对于分类,有一些指标,例如精度和召回率,但是这些指标对于比较两种算法比判断一种算法更好。那么,如何在这里定义正确性? 最后还有性能问题。我知道它是一套完全不同的测试,但是性能是科学工具的重要功能之一,而不是用户满意度或其他软件工程指标。 我最大的问题之一是数据结构。我可以针对kd-tree进行的唯一测试是压力测试:插入许多随机向量,然后执行许多随机查询,然后与朴素的线性搜索进行比较。性能相同。使用数值优化器,我可以测试基准功能,但是再次,这是压力测试。我不认为这些测试可以归类为单元测试,最重要的是,它们不能连续运行,因为其中大多数都很繁重。但是我也认为这些测试需要完成,我不能只插入两个元素,弹出根,是的,它适用于0-1-n的情况。 那么,这种软件的(单元)测试方法是什么(如果有)?以及如何围绕代码-构建-提交-集成周期组织单元测试和繁重的单元测试?