Работа с веб-тестами
Методические рекомендации

Общее описание работы с тестами
Тестовая система является, по-сути, cgi-скриптом, запускаемым под управлением web-сервера Apache. Таким образом, для поддержки данной системы необходимы:

Вопросы для каждого теста должны храниться в отдельных директориях. Удобно хранить все эти директории в той же директории, в которой расположен файл index.html, являющийся, по-сути, интерфейсом к тестовой системе.

Для запуска теста с ученического компьютера, необходимо выполнить следующее:

  1. запустить браузер и подключиться к главной странице локального сайта (или собственно на сайт с тестами, если на сервере под них выделен отдельный виртуальный сервер; тогда следующий шаг пропускается);
  2. щелкнуть по ссылке на тесты -- в браузере отобразится содержимое входного интерфейса к тестовой системе;
  3. в поле, расположенное в верхней части web-страницы, необходимо ввести фамилию и имя учащегося (без заполнения этого поля система к дальнейшим шагам не перейдет);
  4. отметить тест (используется переключатель типа «radio»), который учащийся должен пройти (если тесты сгруппированы, необходимо сначала отметить нужную группу тестов, а затем из выпадающего списка выбрать тест);
  5. нажать кнопку «Пройти тест», расположенную внизу web-страницы, или нажать клавишу <Enter>;
  6. появится первый вопрос теста, необходимо выбрать правильный ответ на него и нажать кнопку «Ответить»;
  7. аналогично необходимо ответить на все пункты теста;
  8. после ответа на последний вопрос, появится сообщение с оценкой, полученной учащимся за тест.

Параллельно с прохождением учащимся теста в директории /dev/shm создается файл, test-var.IP, где IP -- IP-адрес компьютера, на котором учащийся проходит тест. В этот файл заносится следующая информация:

  1. дата и время прохождения теста;
  2. имя учащегося и название директории, в которой расположен проходимый им тест;
  3. номера вопросов, на которые отвечает учащийся, с отметкой +, если ответ был верным, и - в случае неверного ответа;
  4. после ответа учащимся на последний вопрос, в файл протокола заносится оценка, полученная учащимся за тест.
Файл протокола позволяет отслеживать случаи повторного прохождения теста, а также возврата к предыдущим вопросам для изменения варианта ответа на них.

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

Для подготовки новых тестов необходимо выполнить следующие действия:

  1. занести тестовые вопросы в один файл, вопросы должны иметь следующую структуру:
  2. поместить данный файл в отдельную директорию (можно разместить ее сразу в корневой директории тестовой системы);
  3. запустить прилагаемый к системе тестов скрипт brkfl, предназначенный для разбиения заготовки на отдельные вопросы; скрипт имеет следующий синтаксис:
    brkfl NAME NUMQ NUMVAR,
    где NAME - имя файла-заготовки, NUMQ - количество вопросов в тесте, NUMVAR - количество вариантов;
  4. в итоге в директории появляются файлы отдельных вопросов, имеющие последовательную нумерацию, начиная с 1 (если вариант теста один), или же пронумерованные в виде Q-V, где Q - номер вопроса, V - номер ответа;
  5. в директории с тестом необходимо создать два файла: в файл maxvar следует занести количество вариантов теста (даже если вариант один, следует записать туда единицу), а в файл total -- количество вопросов в данном тесте.

Для возможности запуска данного теста необходимо в корневой файл с названием index.html внести информацию о нем. Примеры тестов сопровож даются соответствующим файлом. Обратите внимание на строку

<form name="choose" action=/cgi-bin/test-var method=post">
Она сообщает серверу, что данные формы будут обрабатываться cgi- test-var, расположенным в директории /cgi-bin сервера, а для передачи данных формы используется метод post. Для преобразования данных в понятный для скрипта вид используется скрипт convert (тексты скриптов и образец файла index.html приведены в приложении).

Если тест является единственным в своем роде, ему может соответствовать запись:

<input type=radio name="file" value="DIR">
Название теста<p>
Вместо записи DIR необходимо занести название директории, в которую помещены вопросы соответствующего теста (желательно называть эти директории, не используя пробелов и русских букв). В поле Название теста можно поместить, при желании, количество вопросов в данном тесте.

Если же возникает необходимость сгруппировать тесты (например, несколько тем одного предмета), в файл index.html следует поместить следующую информацию:

<input type=radio name="file" value="PREF">
<big><b>Предмет</b></big><p>
<select name="fil">
<option value="SUF1">Тема 1
<option value="SUF2">Тема 2
..........................
<option value="SUFn">Тема n
</select><p>
В данном случае, когда учащийся отмечает «галочкой» нужный предмет и выбирает из выпадающего списка какую-либо тему (допустим, тему 1), название директории, из которой будут браться тестовые вопросы, формируется в виде PREFSUF1. Т.е., если вместо PREF Вы написали info, а вместо SUF1 -- 01algo, тестовые вопросы будут извлекаться из директории info01algo. Следует иметь в виду такое именование директорий при подготовке групп тестов.

Тесты с вариантами
Если учащиеся проходят тесты большой группой, не исключено, что они будут подсказывать друг другу номера правильных ответов. Для того, чтобы это усложнить, предусмотрена вариация вопросов внутри теста.

Выше уже говорилось, что если Вы подготавливаете несколько вариантов одного и того же теста, вопросы будут иметь нумерацию вида Q-V. При прохождении учащимся теста с вариантами, для выбора очередного вопроса скрипт генерирует случайное число V в диапазоне от 1 до числа, занесенного в файл maxvar. Число Q соответствует текущему номеру вопроса.

В результате, несмотря на то, что все учащиеся проходят один и тот же тест, вопросы с одинаковыми номерами у них будут разными.

Если же вариант теста один, скрипт просто перебирает по-очереди номера вопросов от 1 до числа, занесенного в файл total.

Ручная подготовка файлов
Если Вы желаете подготовить файлы вопросов теста вручную (без помощи скрипта brkfl), имейте в виду следующее.

Приложения
Скрипт test-var

#!/bin/sh
addr=$REMOTE_ADDR
list=/dev/shm/test-var.$addr
eval `./convert`
echo -e "Content-type: text/html\n"
cat header.txt
if [ "$name" = "" ]; then
    echo "<a href=/Tests/index.html><h1 align=center>Введите ваше имя!</h1></a>"
    exit
fi
if [ "$file" = "" ]; then
    echo "<a href=/Tests/index.html><h1 align=center>Выберите тест!</h1></a>"
    exit
fi
[ "$num" = "" ] && num=1
total=`cat ../Tests/$file/total`
maxvar=`cat ../Tests/$file/maxvar`
if [ $num = 1 ]; then
    echo -e "\n\n\n" >> $list
    date >> $list
    echo -e "\n$name\t---\t$file\n" >> $list
else
    echo -e "$[num-1]\t\c" >> $list
fi
[ "$last" != "" ] && last=$[$last % 11]
if [ "$last" = "$a1" -a "$last" != "" ]; then
    echo "+" >> $list
    right=$[right+1]
else
    [ "$last" != "" ] && echo "-" >> $list
fi
if [ $maxvar -gt 1 ]; then
    rnd_num=-$[`./rand $maxvar` + 1]
else
    rnd_num=""
fi
if [ "$num" -le "$total" ]; then
    echo -e "<FORM NAME=\"Test\" action=\"/cgi-bin/test-var\" method=\"POST\">"
    i=0
    echo -e "<h1 align=center>Вопрос $num из $total</h1>"
    CHKD="checked"
    while read Qwest
    do
	if [ $i = 0 ]; then 
	    echo -e "<h2 align=center>$Qwest</h2>"
        elif [ $i -lt 5 ]; then
	    echo -e "<P><INPUT TYPE=RADIO NAME=\"a1\" $CHKD VALUE=\"$i\">$Qwest</P>"
	    CHKD=""
	fi
    i=$[i+1]
    Answ=$Qwest
    done <../Tests/$file/$num$rnd_num
    num=$[num+1]
    val=$[`./rand` * 11 + $Answ]
    echo -e "<input type=hidden name=\"file\" value=\"$file\">\
    <input type=hidden name=\"num\" value=\"$num\">\
    <input type=hidden name=\"last\" value=\"$val\">\
    <input type=hidden name=\"name\" value=\"$name\">\
    <input type=hidden name=\"right\" value=\"$right\">"
    echo -e "<input type=submit value=\"Ответить\"></FORM>"
else
    echo -e "<h1 align=center><font color=blue>$name!</font><p><p><p>\
    Вы дали $right правильных ответов</h1>"
    BAL=`echo -e "scale=3\n oz=$right/$total\n if (oz<.5) 2 else if (oz<.7) 3 \
    else if (oz<.9) 4 else 5"|bc`
    echo -e "<h1 align=center>Ваша оценка: \
    <font color=red>$BAL</font></h1><p><p><p>\n"
    echo -e "<h3 align=center><a href=/Tests/index.html>Вернуться</a></h3>\n"
    echo -e "\n\n\t\tИтоговая оценка:\t$BAL\n\n\n\n\n" >> $list
fi
echo "</body></html>"
Скрипт convert

#!/bin/sh
#Converts Data sent by method Post or Get
#into stdout like param1 name1 param2 name2 etc.

if [ "$REQUEST_METHOD" = "POST" ] ; then
    QUERY_STRING=`sed "s/\\\`/_/g"`
fi

line=`echo $QUERY_STRING|sed 's/&/ /g'`

for pair in $line
do
    name=`echo $pair|sed 's/=/ /g'|awk '{print $1}'`
    type=`echo $pair|sed 's/=/ /g'|awk '{print $2}'|\
	sed -e 's/%\(\)/\\\x/g'|sed 's/+/ /g'`
    printf "${name}=\"${type}\"\n"
done
Образец файла index.html

<html>
<meta http-equiv="Content-Type" content="text/html; charset=koi8-r">
    <title>Электронные тесты</title>
    <body alink="#000099" vlink="#993300" link="#006600"
 style="color: rgb(0,0,0); background-color: rgb(153,153,153);"
 text="#000000" bgcolor="#999999">
<form name="choose" action=/cgi-bin/test-var method=post">
<h3 align=left>Введите ваше имя:
<input type=text size=100 name=name></h3>
<hr>
<h1 align=center>Выберите, какой из тестов вы хотите пройти:</h1>
<h3 align=left>Астрономия</h3>
<input type=radio name="file" checked value=astro1>
Астромия (сферическая астрономия), 20<p>
<input type=radio name="file" value=astro2>Астрономия (основы космологии), 20<p>
<h3 align=left>Математика</h3>
<input type=radio name="file" value=math2>Входной срез по математике, 14<p>
<input type=radio name="file" value=math1>Итоговый тест по высшей математике, 27<p>
<input type=radio name="file" value=it><big><b>Информационные технологии</b></big><p>
<select name="fil">
<option value=01>Информационные технологии (информация), 8
<option value=02>Информационные технологии (файловые и операционные системы), 12
<option value=03>Информационные технологии (обработка текстовой информации), 11
<option value=04>Информационные технологии (электронные таблицы), 9
<option value=05>Информационные технологии (редактирование изображений), 8
<option value=06>Информационные технологии (специализированные приложения), 10
<option value=07>Информационные технологии (алгоритмы и основы программирования), 13
<option value=08>Информационные технологии (язык С), 14
<option value=09>Информационные технологии (АСУ), 8
<option value=10>Информационные технологии (Элементы АСУ), 10
<option value=11>Информационные технологии (Сетевые технологии), 12
<option value=12>Информационные технологии (Моделирование и прогнозирование), 12
<option value=end>Информационные технологии (итоговый тест), 20
</select><p>
<h3 align=left>Информатика</h3>
<input type=radio name="file" value=inform2>Информатика (итоговый тест), 12<p>
<h3 align=left>Спецтехнология</h3>
<input type=radio name="file" value=automatisation>
Автоматизация деревообрабатывающего производства, 17<p>
<input type=submit value="Пройти тест!">
</form>
</body>
</html>
Скрипт brkfl

#!/bin/sh
# Разбивает сложный файл с большим количеством вопросов и
# ответов на маленькие
# ./brkfl <файл> <кол-во вопросов> <кол-во вариантов>
#
# во входном файле вопросы располагать последовательно:
# все вопросы первого варианта, ... ,
# все вопросы последнего варианта

NUMEROFLINES=6	# Количество строк на вопрос
cntr1=1		# счетчик
var=$3		# Количество вариантов
num=$2		# Количество вопросов
file=$1		# Название файла
mysplit(){
cntr=1
    if [ "$1" != "" ]; then
	pref=$[ $[ $1 - 1 ] * $NUMEROFLINES * $num ] # 
	postf="-$1"
    else
	pref=0
	postf=""
    fi
    while [ "$cntr" -le "$num" ]
    do
	echo -e "\t\tВопрос $cntr"
	head -n $[ $cntr * $NUMEROFLINES + $pref ] $file|\
	tail -n $NUMEROFLINES > $cntr$postf
	cntr=$[ $cntr + 1 ]
    done
}
if [ "$var" = "" ]; then
    mysplit 
else
    while [ "$cntr1" -le "$var" ]
    do
	echo "Вариант $cntr1"
	mysplit $cntr1
	cntr1=$[ $cntr1 + 1 ]
    done
fi


Edward V. Emelianoff 2009-06-11
Hosted by uCoz