Как тестируются скрипты fcgi?

Я новичок, так что простите меня, если это звучит наивно. Написал скрипт на fastcgi ++. И я протестировал основные варианты использования. Но, как хороший инженер-программист, я хочу тестировать сценарий каждый раз, когда вношу изменения, чтобы убедиться, что я ничего не сломаю.

Раньше я делал вот что:

Это была моя структура каталогов:

script:

 - bin 
 - build (contained the bash script to compile the script)
 - src
 - tests  
    - build (contained bash script to compile the test)
    - src (contained the test file)
    - output

Взломал так, как тестировал. Я использовал curl для вызова моего скрипта и перенаправления его вывода в файл в тестах / выводе (с использованием относительного пути) и сравнения его с ожидаемым выводом. Я мог это сделать, потому что тесты были скомпилированы вручную, и я выполнил тесты только после изменения каталога на tests/build. Недавно я решил использовать систему сборки. Я выбрал мезон. Тестирование с использованием мезона выполняется с помощью meson test или ninja test. Проблема в том, что теперь я не контролирую, откуда запускается тест.

Как протестировать в таких обстоятельствах? А как вы тестируете свои скрипты fcgi?

Изменить: это пример того, как я компилировал и тестировал. Это полный проверяемый пример:

#include <fastcgi++/request.hpp>
#include <fastcgi++/manager.hpp>

class test : public Fastcgipp::Request<char> 
{
    bool response() {
        nlohmann::json output;

        out << "Content-Type: application/json; charset:utf-8\r\n\r\n";
        out << "{\"success\": true}";
    }
}

int main() {
    Fastcgipp::Manager<test> manager;

    manager.setupSignals();
    manager.listen();
    manager.start();
    manager.join();
}   

Вы можете думать об ответе как о главном. Здесь вы начинаете обрабатывать вещи. Вы можете вводить и выводить данные и все такое хорошее.

Вот как я тестирую:

TEST(test, test1) {

    std::string fileName = "test.txt";

    nlohmann::json input, output;
    input["success"] = true;

    std::system(std::string("curl -X GET \"localhost/cgi-bin/test.fcg\" > " + fileName).c_str());

    std::ifstream file(fileName);
    std::string out;
    std::getline(file, out);

    output = nlohmann::json::parse(out);

    ASSERT_EQ(input, output);

    std::system(std::string("rm " + fileName).c_str());
}

Примечания: nlohmann :: json - это парсер json, и я использую в этом тесте тест Google.


person Hemil    schedule 27.09.2019    source источник


Ответы (1)


Проблема в том, что теперь я не контролирую, откуда запускается тест.

По умолчанию тест запускается в каталоге сборки, но есть параметр workdir (см. reference), который можно использовать для установки абсолютного пути, который будет использоваться в качестве рабочего каталога для теста, например:

exe = executable(...)
wdir = join_paths(meson.current_source_dir(), 'some_dir')
test('basic', exe, workdir : wdir)

Проверьте объект meson для других возможных справочных каталогов.

person pmod    schedule 27.09.2019
comment
Так был ли протестирован fcgi или есть способ лучше? - person Hemil; 28.09.2019
comment
@Hemil лучше очень расплывчатые критерии, чем лучше? Я думаю, что если вы используете мезон для построения, это имеет смысл использовать мезон для запуска тестов. Если у вас есть конкретный вопрос о том, как тестировать программу или скрипт - добро пожаловать, чтобы предоставить более конкретный пример. - person pmod; 29.09.2019
comment
Я привык тестировать, вызывая функцию и проверяя ее возвращаемое значение. Мне казалось странным чтение из файлов; P - person Hemil; 29.09.2019
comment
@Hemil Спасибо, что согласились, если вам нужен лучший совет - можете ли вы показать пример того, как вы строите и тестируете, потому что я не понимаю, что читается из файлов, связанных с - person pmod; 30.09.2019
comment
Задайте вопрос сейчас и дайте мне знать, если вам нужны более подробные сведения. - person Hemil; 01.10.2019
comment
@Hemil Я предлагаю вам изучить некоторые основы модульного тестирования, у вас есть что-то похожее на функциональный тест. Это нормально, если у вас все в порядке, и это поможет вам убедиться, что изменения безопасны. Однако вы не можете проверить каждый аспект реализованного класса C ++ или модуля C. Основное отличие заключается в том, что вы связываете свою библиотеку или программный модуль и пробуете какой-либо общедоступный метод с действительными и недопустимыми входными данными, чтобы позже проверить, получили ли вы ожидаемые результаты. Я нашел несколько модульных тестов, связанных с fastcgi, взгляните: github .com / crnt / Fastcgi-Daemon / blob / master / tests /. - person pmod; 07.10.2019
comment
Познакомьтесь с основами модульного тестирования. Моя проблема в том, что на данный момент сценарии слишком малы для дальнейшего разбиения на независимые части (может быть, 100–150 строк кода в каждом сценарии). Как и все, что я делаю, это проверяю правильность параметров, выполняю запрос к базе данных и возвращаю JSON. Я не могу придумать способ модульного тестирования этого - person Hemil; 09.10.2019