-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathRchk
117 lines (109 loc) · 4.36 KB
/
Rchk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/bin/sh
DIR="Скрипт автоматизации тестирования ПО
@(#) Rchk V1.23 (C) 2023 by Roman Oreshnikov
Это бесплатное ПО поставляется без каких-либо ГАРАНТИЙ
Использование: Rchk [параметр]... [файл]...
Параметры:
-h Показать этот текст
-l LOG Протокол тестирования сохранять в файл LOG
-r RUN Тестируемая программа
-t TMP Каталог тестирования
Файл:
shell-скрипт сценария тестирования
Предопределенные функции:
- завершение тестирования с фиксацией причины в протоколе и на стандартный вывод
End причина
- фиксация текста в протоколе
Log [+|-] текст
+ дубликат на стандартный вывод
- только на стандартный вывод
- вывести командную строку реципиента на стандартный вывод и запустить его
Run [параметр]...
- определение нового этапа теста и анализ результата завершения предыдущего
Tst код:число текст
код - ожидаемый код завершения
число - ожидаемое количество строк вывода
текст - описание этапа
Зарезервированные имена переменных:
DIR - стартовый каталог
LOG - файл для записи протокола
NUM - номер текущего теста
REZ - ожидаемый результат завершения этапа
RUN - программа-реципиент
TMP - файл сохранения вывода этапа
Сообщать об ошибках <r.oreshnikov@gmail.com>"
LOG=
RUN=
TMP=
while getopts hl:r:t: REZ; do
case $REZ in
h) echo "$DIR"; exit;;
l) LOG=$OPTARG;;
r) RUN=$OPTARG;;
t) TMP=$OPTARG;;
?) echo "'$0 -h' для дополнительной информации" >&2; exit 1
esac
done
shift $((OPTIND - 1))
End() { echo "${0##*/}: $*" >&2; exit 1; }
[ -n "$RUN" ] || End "Не задано имя тестируемой программы"
[ -n "$LOG" ] || End "Не задано имя файла для записи протокола тестирования"
touch "$LOG" 2>/dev/null || End "Ошибка создания файла протокола тестирования"
if [ -z "$TMP" ]; then REZ=$(mktemp -dq); else mkdir -p "$TMP" 2>/dev/null; fi
[ $? = 0 ] || End "Ошибка создания рабочего каталога"
DIR=$(pwd)
case $TMP in "") TMP=$REZ/.#~;; /*) TMP=$TMP/.~;; *) TMP=$DIR/$TMP/.~;; esac
LANG=C
End() {
trap 0
[ $# != 0 ] && REZ= && Log + "$*"
echo >&4
Log + "Тестирование ${REZ:+успешно }завершено:" $(date +%c)
[ "x${TMP##*/}" = x.#~ ] && rm -rf "${TMP%/*}" || rm -f "$TMP"
Log - "Протокол тестирования: $LOG"
exit $#
}
Log() {
case $1 in
+) shift; echo "$*" >&3; echo "# $*" >&4;;
-) shift; echo "$*" >&3;;
*) echo "# $*" >&4
esac
}
Run() {
echo "$ ${RUN##*/}"${@:+ $(for P in "$@"
do case $P in *[\ *?]*) P="\"$P\"";; esac; echo -n " $P"; done)}
$RUN "$@"
}
Tst() {
REZ="$REZ == $?"
[ -n "$NUM" ] && cat "$TMP" >&4 && REZ=$REZ:$(cat "$TMP" | wc -l) &&
case $REZ in
${REZ##* }\ =*) Log "Тест №$NUM выполнен успешно, $REZ";;
*) End "Тест №$NUM провален, ${REZ%%=*}!=${REZ##*=}"
esac
[ $# = 0 ] && End
exec >"$TMP" 2>&1
echo >&4
case $1 in
+) Log "$@"; NUM= REZ=;;
*) NUM=$(($NUM + 1)) REZ=$1; shift; Log + "$NUM. $*"
esac
}
NUM=
REZ=
exec 3>&1 4>"$LOG"
trap Tst 0 1 2 3 13 15
Log + "Тестирование '$RUN' начато:" $(date +%c)
[ -f "$RUN" ] && case $RUN in /*);; *) RUN=$DIR/$RUN;; esac &&
[ ! -x "$RUN" ] && RUN="sh $RUN"
readonly DIR LOG TMP End Log Run Tst
while [ $# != 0 ]; do
[ -f "$1" -a "$1" ] || End "Cценарий тестирования '$1' недоступен"
Tst + "Выполняется сценарий '$1'"
cd "${TMP%/*}"
case $1 in /*) . "$1";; *) . "$DIR/$1";; esac
Tst + "Сценарий '$1' успешно выполнен"
cd "$DIR"
shift
done