Я не инженер по программному обеспечению. Я аспирант в области наук о Земле.
Почти два года назад я начал программировать научное программное обеспечение. Я никогда не использовал непрерывную интеграцию (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 итераций, и на каждой итерации вы создаете ~ 500-20 000 экземпляров объектов на основе моделирования Монте-Карло. Если только один результат одной итерации немного отличается, все последующие итерации будут совершенно другими. Как вы справляетесь с этой ситуацией? Я полагаю, что это большой смысл против сквозных тестов, так как конечный результат сильно варьируется?
Любой другой совет с CI высоко ценится.