Bash 用于测试程序的脚本

Bash script for testing a program

这是一个简单的字符串反转程序。

void str_reverse(const char*, size_t, char*, size_t);

int main(){

    char str[256];

    while(fgets(str, 256, stdin)){
        if(strncasecmp(str, "quit", 4) == 0) break;

        size_t size_reversed = strlen(str) * sizeof(char);
        char* reversed = malloc(size_reversed);
        str_reverse(str, sizeof(str), reversed, size_reversed);
        printf("Orginal String : %s\n", str);
        printf("Reversed String : %s\n", reversed);
        printf("__________________________________\n");
        free(reversed);
    }
    return 0;
}

void str_reverse(const char* str1, size_t size1, char* str2, size_t size2){

    memcpy(str2, str1, size1);

    char temp;
    size_t len = strlen(str2) - 1;
    size_t stop = len/2;
    size_t i,k;

    for(i = 0, k = len; i < stop; i++, k--)
    {
        temp = str2[k];
        str2[k] = str2[i];
        str2[i] = temp;
    }
    //return str;
}

我正在尝试编写一个 bash 脚本来自动编译和测试该程序。我有以下测试用例:

谁能帮我开始做这件事。谢谢

也许是这样的:

#!/bin/bash
gcc source -o xname
echo "teststring" | ./xname
echo "teststring2" | ./xname
...

您可以使用 BATS 进行自动化测试。这是自动化测试的好工具。

添加必要的包含文件后,

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

您可以使用如下脚本,

#!/bin/bash

# Compile reverse.c
make reverse

# Declare and feed test strings
declare -a string_array=("" "string" "12345" "string STRING")

for str in ${string_array[@]}
do
    echo "$str" | ./reverse
done

我会更改程序以接受要反转的字符串作为命令行参数,然后打印反转后的字符串作为输出。然后,使用 bash 脚本将程序的输出与预期输出进行比较。

int main(int argc, char* argv[]){

   if ( argc != 2 )
   {
      fprintf(stderr, "Expect to see one argument.\n");
      return EXIT_FAILURE;
   }

   char* str = argv[1];

   size_t size_reversed = strlen(str) * sizeof(char);
   char* reversed = malloc(size_reversed+1);
   str_reverse(str, strlen(str), reversed, size_reversed);
   printf("%s\n", reversed);
   free(reversed);

   return EXIT_SUCCESS;
}

和 bash 脚本:

#!/bin/bash

function test_program()
{
   in=""
   expected_out=""
   out=$(./program "$in")

   if [ "$out" != "$expected_out" ]
   then
      echo "output: $out"
      echo "expected output: $expected_out"
      echo "Test failed."
   else
      echo "Test passed"
   fi
}

test_program "automate the compilation" "noitalipmoc eht etamotua"
test_program "compilation" "noitalipmoc"
test_program "abcd" "dcba"