我不是软件工程师。我是地球科学领域的博士生。
大约两年前,我开始编写科学软件。我从未使用过持续集成(CI),主要是因为起初我不知道它的存在,而且我是唯一使用此软件的人。
现在,由于该软件的基础正在运行,因此其他人开始对它产生兴趣并希望为该软件做出贡献。计划是其他大学的其他人正在实施核心软件的添加。(我担心他们会引入错误)。此外,该软件变得非常复杂,并且变得越来越难以测试,我也计划继续进行开发。
由于这两个原因,我现在越来越多地考虑使用CI。因为我从未接受过软件工程师的培训,而且周围的人都没有听说过CI(我们是科学家,所以没有程序员),所以我很难开始我的项目。
我有几个问题想向我寻求建议:
首先简要说明该软件的工作方式:
该软件由一个包含所有必需设置的.xml文件控制。您只需通过将路径传递到.xml文件作为输入参数来启动软件,它就会运行并创建带有结果的几个文件。一次运行可能需要30秒钟。
这是一个科学软件。几乎所有的函数都有多个输入参数,它们的类型主要是非常复杂的类。我有多个具有大型目录的.txt文件,用于创建这些类的实例。
现在让我们来问我的问题:
单元测试,集成测试,端到端测试?:我的软件现在大约有30.000行代码,具有数百个功能和约80个类。开始为数百种已经实现的功能编写单元测试对我来说有点奇怪。因此,我考虑过简单地创建一些测试用例。准备10-20个不同的.xml文件,然后运行该软件。我猜这就是所谓的端到端测试?我经常读到您不应该这样做,但是如果您已经拥有可以运行的软件,那么也许可以开始吗?还是尝试将CI添加到已经运行的软件中只是愚蠢的想法。
如果功能参数难以创建,如何编写单元测试? 假设我有一个函数
double fun(vector<Class_A> a, vector<Class_B>)
,通常,我需要首先读取多个文本文件来创建类型为Class_A
和的对象Class_B
。我考虑过要创建一些虚拟功能,例如Class_A create_dummy_object()
不读取文本文件。我还考虑过实现某种序列化。(我不打算测试类对象的创建,因为它们仅依赖于多个文本文件)如果结果变化很大,如何编写测试?我的软件利用了大型蒙特卡洛模拟并可以迭代地工作。通常,您需要进行约1000次迭代,并且每次迭代都基于Monte Carlo模拟创建约500-20.000个对象实例。如果一次迭代的一个结果只有一点点不同,则整个即将到来的迭代将完全不同。您如何处理这种情况?我认为这对端到端测试来说很重要,因为最终结果变化很大?
对于CI的其他建议,我们深表感谢。