2012-04-12 10 views
6

Tôi rất mới viết kịch bản và tôi gặp khó khăn trong việc tìm ra cách bắt đầu trên tập lệnh bash sẽ tự động kiểm tra đầu ra của chương trình dựa trên kết quả mong đợi.Kịch bản Bash tự động kiểm tra đầu ra chương trình - C

Tôi muốn viết một tập lệnh bash sẽ chạy một tập tin được chỉ định trên một tập hợp các đầu vào thử nghiệm, nói in1 in2, vv, so với các kết quả mong đợi tương ứng, out1, out2, vv và kiểm tra xem chúng có khớp không. Các tập tin được kiểm tra đọc đầu vào của nó từ stdin và viết đầu ra của nó để stdout. Vì vậy, việc thực hiện chương trình thử nghiệm trên một tệp đầu vào sẽ liên quan đến chuyển hướng I/O.

Tập lệnh sẽ được gọi với một đối số duy nhất, đây sẽ là tên của tệp thi hành được kiểm tra.

Tôi đang gặp sự cố khi thực hiện việc này, vì vậy bất kỳ trợ giúp nào (liên kết tới bất kỳ tài nguyên nào giải thích thêm về cách tôi có thể thực hiện việc này) sẽ được đánh giá cao. Tôi đã cố gắng tìm kiếm bản thân mình nhưng chưa thành công lắm.

Cảm ơn!

+1

Bạn có thể sử dụng lệnh 'diff' hoặc' cmp' để so sánh kết quả đầu ra. –

+0

Các chương trình 'diff',' cmp' và 'comm' (đặc biệt là hai chương trình đầu tiên) được sử dụng để so sánh hai tệp. Vì vậy, bạn có thể nắm bắt đầu ra mong đợi trong một tệp, đầu ra thực tế trong một tệp khác và sau đó so sánh các tệp. Đây là cách đơn giản nhất để làm điều đó; nó không nhất thiết phải là tốt nhất. –

+0

Tôi nghĩ rằng mô tả của bạn hơi sai. Cách tôi đọc nó, bạn muốn các đầu vào để phù hợp với kết quả đầu ra. Nhưng tôi nghĩ bạn có nghĩa là bạn có đầu vào thử nghiệm, đầu ra thực tế và kết quả đầu ra mong đợi. Và bạn muốn phân biệt hai cái cuối cùng. – Mikel

Trả lời

0

Chức năng. Herestrings. Chuyển hướng. Thay thế quy trình. diff -q. test.

2

Expect có thể là hoàn toàn phù hợp cho các loại hình vấn đề:

Mong đợi là một công cụ chủ yếu cho việc tự động hóa các ứng dụng tương tác như telnet, ftp, passwd, fsck, rlogin, mũi vv Mong đợi thực sự làm cho nội dung này trở nên tầm thường. Mong đợi cũng hữu ích khi thử nghiệm các ứng dụng tương tự này.

0

Đầu ra dự kiến ​​là loại đầu vào thứ hai.

Ví dụ, nếu bạn muốn thử nghiệm một hàm vuông, bạn sẽ có đầu vào như (0, 1, 2, -1, -2) và đầu ra dự kiến ​​là (0, 1, 4, 1, 4).

Sau đó, bạn sẽ so sánh mọi kết quả của đầu vào với đầu ra dự kiến ​​và lỗi báo cáo chẳng hạn.

Bạn có thể làm việc với mảng:

in=(0 1 2 -1 -2) 
out=(0 1 4 2 4) 

for i in $(seq 0 $((${#in[@]}-1))) 
do 
    ((${in[i]} * ${in[i]} - ${out[i]})) && echo -n bad" " || echo -n fine" " 
    echo $i ": " ${in[i]}"² ?= " ${out[i]} 
done 

fine 0 : 0² ?= 0 
fine 1 : 1² ?= 1 
fine 2 : 2² ?= 4 
bad 3 : -1² ?= 2 
fine 4 : -2² ?= 4 

Tất nhiên bạn có thể đọc cả hai mảng từ một tập tin.

Kiểm tra bằng ((...)) có thể gọi biểu thức số học, chuỗi và tệp. Hãy thử

help test 

để biết tổng quan.

chuỗi Reading wordwise từ một tập tin:

for n in $(< f1); do echo $n "-" ; done 

đọc vào một mảng:

arr=($(< file1)) 

đọc tập tin linewise:

for i in $(seq 1 $(cat file1 | wc -l)) 
do 
    line=$(sed -n ${i}p file1) 
    echo $line"#" 
done 

kiểm tra chống lại chương trình đầu ra âm thanh như chuỗi so sánh và bắt đầu chương trình n=$(cmd param1 param2):

asux:~/prompt > echo -e "foo\nbar\nbaz" 
foo 
bar 
baz 
asux:~/prompt > echo -e "foo\nbar\nbaz" > file 
asux:~/prompt > for i in $(seq 1 3); do line=$(sed -n ${i}p file); test "$line" = "bar" && echo match || echo fail ; done 
fail 
match 
fail 

Tiếp tục usesful: Thường xuyên biểu hiện phù hợp trên Strings với = ~ trong ngoặc [[...]]:

for i in $(seq 1 3) 
do 
    line=$(sed -n ${i}p file) 
    echo -n $line 
    if [[ "$line" =~ ba. ]]; then 
    echo " "match 
    else echo " "fail 
    fi 
done 
foo fail 
bar match 
baz match 
8

Nếu tôi nhận được những gì bạn muốn; điều này có thể giúp bạn bắt đầu:

Kết hợp giữa các công cụ bên ngoài và bash khác.

#!/bin/bash 

# If number of arguments less then 1; print usage and exit 
if [ $# -lt 1 ]; then 
    printf "Usage: %s <application>\n" "$0" >&2 
    exit 1 
fi 

bin="$1"   # The application (from command arg) 
diff="diff -iad" # Diff command, or what ever 

# An array, do not have to declare it, but is supposedly faster 
declare -a file_base=("file1" "file2" "file3") 

# Loop the array 
for file in "${file_base[@]}"; do 
    # Padd file_base with suffixes 
    file_in="$file.in"    # The in file 
    file_out_val="$file.out"  # The out file to check against 
    file_out_tst="$file.out.tst" # The outfile from test application 

    # Validate infile exists (do the same for out validate file) 
    if [ ! -f "$file_in" ]; then 
     printf "In file %s is missing\n" "$file_in" 
     continue; 
    fi 
    if [ ! -f "$file_out_val" ]; then 
     printf "Validation file %s is missing\n" "$file_out_val" 
     continue; 
    fi 

    printf "Testing against %s\n" "$file_in" 

    # Run application, redirect in file to app, and output to out file 
    "./$bin" < "$file_in" > "$file_out_tst" 

    # Execute diff 
    $diff "$file_out_tst" "$file_out_val" 


    # Check exit code from previous command (ie diff) 
    # We need to add this to a variable else we can't print it 
    # as it will be changed by the if [ 
    # Iff not 0 then the files differ (at least with diff) 
    e_code=$? 
    if [ $e_code != 0 ]; then 
      printf "TEST FAIL : %d\n" "$e_code" 
    else 
      printf "TEST OK!\n" 
    fi 

    # Pause by prompt 
    read -p "Enter a to abort, anything else to continue: " input_data 
    # Iff input is "a" then abort 
    [ "$input_data" == "a" ] && break 

done 

# Clean exit with status 0 
exit 0 

Chỉnh sửa.

Đã thêm kiểm tra mã thoát; Và một máng đi bộ ngắn:

Điều này sẽ ở làm ngắn:

  1. Kiểm tra nếu lập luận được đưa ra (bin/ứng dụng)
  2. Sử dụng một loạt các "tên cơ sở", vòng lặp này và tạo ra tên tập tin thực .
    • Ie: Có mảng ("file1" "file2") bạn nhận được
      • Trong file: file1.in
      • Out tập tin để xác nhận đối với: file1.out
      • Out file: file1.out.tst
      • Trong file: file2.in
      • . ..
  3. Execute ứng dụng và chuyển hướng trong tập tin để stdin cho ứng dụng bằng cách <, và chuyển hướng stdout từ ứng dụng để kiểm tra tập tin hiện bởi >.
  4. Sử dụng công cụ như số diff để kiểm tra xem chúng có giống nhau hay không.
  5. Kiểm tra mã thoát/trả về từ công cụ và thông báo in (FAIL/OK)
  6. Nhắc để tiếp tục.

Bất kỳ và tất cả khóa học nào có thể được sửa đổi, xóa, v.v ...


Một số liên kết:

+0

Wow cảm ơn bạn rất nhiều! – Shabu

0

Đầu tiên hãy nhìn vào chương nâng cao Bash-Scripting Guide trên I/O redirection.

Sau đó, tôi phải hỏi Tại sao lại sử dụng tập lệnh bash? Làm điều đó trực tiếp từ makefile của bạn.

Ví dụ tôi có một generic makefile chứa một cái gì đó như:

# type 'make test' to run a test. 
# for example this runs your program with jackjill.txt as input 
# and redirects the stdout to the file jackjill.out 
test: $(program_NAME) 
     ./$(program_NAME) <jackjill.txt> jackjill.out 
     ./diff -q jackjill.out jackjill.expected 

Bạn có thể thêm bao nhiêu bài kiểm tra như bạn muốn như thế này. Bạn chỉ cần phân biệt tệp đầu ra mỗi lần với một tệp có chứa kết quả mong đợi của bạn.

Tất nhiên điều này chỉ có liên quan nếu bạn đang thực sự sử dụng một makefile để xây dựng chương trình của bạn. :-)