Тестирование программы c, которая получает пользовательский ввод с терминала

Я пишу программу на c с именем: «shell» (я имитирую оболочку), и я хочу написать несколько тестов, чтобы убедиться, что я следую всем тестовым примерам, поэтому я попытался использовать #include <assert.h>

но я не понимаю, как имитировать пользовательский ввод в терминале. Я попытался использовать файл, содержащий текст, и изменить stdin в этот входной файл, а также перенаправить stdout в выходной файл, но это не сработало.

Я также пытался вставить ввод в терминал с помощью функции system(), но это тоже не сработало.

пример того, как работает программа оболочки

простая версия моей программы оболочки C

Итак, shell.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

int main()
{
    char buf[1024];
    while (1)
    {

        fgets(buf, 1024, stdin);

        if (strncmp(buf, "quit", 4) == 0)
        {
            exit(0);
        }

        int fildes[2];
        pipe(fildes);
        if (fork() == 0)
        {
            close(fildes[0]);
            dup2(fildes[1], STDOUT_FILENO);
            execlp("ls", "ls", "-l", NULL);
            perror("exec error");
            exit(1);
        }
        else
        {
            close(fildes[1]);
            read(fildes[0], buf, 1024);
            printf("%s", buf);
        }
    }
    return 0;
}

поэтому просто скопируйте и вставьте его в файл c и скомпилируйте его или используйте этот онлайн-компилятор, который я нашел, чтобы лучше увидеть функциональность

https://onlinegdb.com/StEq1lNEI

и это моя тестовая программа Итак, test.c

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>


int main()
{
    // change the output of ls -l to a file
    freopen("input.txt", "r", stdin);   //redirects standard input
    freopen("output.txt", "w", stdout); //redirects standard output

    // run the program ./shell
    system("./shell");
    // insert to the program the command ls -l
    system("ls -l");

    // read the output from the file output.txt into a buffer of size 1024
    char buf[1024];
    FILE *fp = fopen("output.txt", "r");
    fread(buf, 1024, 1, fp);
    fclose(fp);

    // compare the output of the program with the output of ls -l
    // if they are the same, the test passes

    // now how do i test the output of the program?
    assert(strcmp("shell.c \n shell",
                  buf) == 0);

    return 0;
}

если вы видите, почему это не работает, пожалуйста, дайте мне знать :) буду очень признателен!

Не могли бы вы улучшить заголовок? Упоминание чего-то о «пользовательском вводе» (например, адрес существующего ответа) облегчит поиск вашего вопроса на этом сайте.

Lover of Structure 02.04.2023 22:01

Пожалуйста, предложите редактирование, и я обновлю, конечно, я не против улучшить вопрос

Dolev Dublon 02.04.2023 22:17

"это не сработало" Пожалуйста, уточните. Что именно не сработало? Покажите, какой ввод приводит к нежелательному результату и что вы хотели бы получить вместо этого.

n. m. 02.04.2023 22:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Есть несколько способов сделать это:

  1. Вызвать оболочку с аргументом, который является путем к файлу скрипта (например): myshell ./myscript.
  2. Вызов с помощью: myshell < ./myscript. Это собственная оболочка (например) bash, которая выполняет перенаправление ввода для вашей оболочки.
  3. В вашей оболочке вы можете реализовать команду source.
  4. Вы можете написать отдельную программу, которая вызывает вашу оболочку под псевдотерминалом (например) /dev/pts/*, /dev/ptmx См.: man 7 pty
  5. Вместо создания собственной программы PTY вы можете использовать команду expect.

Другие вопросы по теме