Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

2.2.1 Разработка тестов. 2.2.2 Разработка тестирующей программы




2. 2. 1 Разработка тестов

Тесты предлагается формировать в виде строки, которая содержит:

· заголовок теста, указывающий номер теста (n) в виде " Тест №n. ";

· основную часть, состоящую из утверждения (или вопроса) по заданной тематике и трех вариантов ответа, каждый из которых имеет номер (1, 2, 3) и задается с новой строки;

· эталонное значение, отделенное от основной части точкой с запятой.

Имеется несколько подходов к формированию вариантов ответа и эталонного значения. Например, из всех вариантов ответа только один вариант сделать правильным, а остальные – неправильными. Но при таком подходе и при трех вариантах ответа полуается слишком большая вероятность угадывания правильного ответа (1/3). Чтобы не увеличивать число вариантов ответа предлагается такой подход к формированию тестов.
Каждый из трех вариантов ответа может быть как правильным, так и неправильным. Если вариант правильный, он имеет значение 1, если нет – 0). Эталонное значение теста формируется из значений вариантов ответа в виде трех двоичных цифр: самой левой цифре соответствует значение первого варианта ответа, средней цифре – значение второго варианта ответа и правой цифре – значение третьего варианта ответа. Например, эталонное значение 101 означает, что первый и третий варианты ответа были правильными, а второй вариант – нет. При таком подходе вероятность угадать правильный ответ уменьшается до 1/8.
Для формирования тестов и записи их на диск разработана программа form_test. py, которая не является серверным приложением и может запускаться на выполнение из среды разработки Python:

import pickle
TESTS=[ 'Тест №1. Изменяемые типы данных: ' \
'< br> 1. кортеж< br> 2. словарь < br> 3. строка; 010',
'Тест №2. Выполняется только чтение из текстового файла: ' \
'< br> 1. mode=\'\' < br> 2. mode=\'r\' < br> 3. mode=\'r+\'; 110',
'Тест №3. Выполняется удаление существующего файла: ' \
'< br> 1. mode=\'w\' < br> 2. mode=\'w+\' < br> 3. mode=\'a\'; 100',
'Тест №4. В качестве ключа словаря могут быть использованы: ' \
'< br> 1. кортежи < br> 2. числа < br> 3. строки; 111',
'Тест №5. Модуль mod имеет фукцию func(). При каком подключении модуля' \
'фукция func() будет непосредсвтвенно доступна программе? ' \
'< br> 1. import mod < br> 2. from mod import func < br> 3. from mod import *; 011' ]

f= open ( 'tests. dat', 'wb' )
pickle. dump(TESTS, f)
f. close()
print ( " It/s done" )

Таким образом в соответствии с выше описанным подходом сформировано пять тестов в виде списка строк TESTS, который с помощью метода dump() модуля pickle в сериализованном виде записан в двоичный файл tests. dat и в последствии может быть использован для получения тестов (см. подраздел 2. 2. 1).

Оглавление

2. 2. 2 Разработка тестирующей программы

В качестве примера серверного приложения, осуществляющего AJAX-взаимодействие с клиентским приложением (см. пример №2 в подразделе 2. 1) разработана программа testing. py:

#! c: /. . . /python. exe
print ( " Access-Control-Allow-Origin: *" )
print ()
import cgi, cgitb, random, pickle
from my_mod import write_results, D
cgitb. enable()
def get_test (file_name): # Функция считывает из файла file_name тесты
f= open (file_name, 'rb' ) # и возвращает один из них
test_list=pickle. load(f)
f. close()
test=random. choice(test_list)
test_list. remove(test)
f= open ( 'cur_tests. dat', 'wb' )
pickle. dump(test_list, f)
f. close()
return test

max_test=3
data=cgi. parse()
if 'name' in data:
# От клиента получено имя тестируемого
test=get_test( 'tests. dat' )
print (D, test. split( '; ' )[0])
user_dict={ # Словарь данных тестируемого содержит:
'name': data[ 'name' ][0], # имя
'number_test': 1, # порядковй номер очередного теста
'tests': [test], # список переданных тестов
'answers': [], # список ответов пользователя
'points': 0 } # число набранных баллов
f= open ( 'user. dat', 'wb' )
pickle. dump(user_dict, f)
f. close()
if 'answer' in data:
# От клиента получен ответ тестируемого
f= open ( 'user. dat', 'rb' )
user_dict=pickle. load(f)
user_dict[ 'answers' ]+=[data[ 'answer' ][0]]
tests=user_dict[ 'tests' ]
etalon=tests[ len (tests)-1: ][0]. split( '; ' )[1]
if data[ 'answer' ][0]==etalon: user_dict[ 'points' ]+=1
if user_dict[ 'number_test' ]< 'max_test:
test=get_test( 'cur_tests. dat' )
print (D, test. split( '; ' )[0])
user_dict[ 'number_test' +=1
user_dict[ 'tests' +=[test]
f= open ( 'user. dat', 'wb' )
pickle. dump(user_dict, f)
f. close()
else:
write_results(user_dict, out_points=1, out_tests=1, out_answers=1)

Оглавление

В начале своей работы программа testing. py подключает необходимые ей для работы модули: cgi, cgitb, random, pickle и функцию write_results с константой D из модуля my_mod. После получения запроса от клиента программа преобразует, используя метод parse() модуля cgi, полученные данные в словарь data и осуществляет их анализ.
Если клиентская часть передала имя пользователя, т. е. словарь data содержит ключ " name" , то выполняются следующие действия:

· с помощью функции get_test('tests. dat'), аргументом которой является имя файла, содержащего разработанные тесты (см. подраздел 2. 2. 1), осуществляется выбор теста с именем test:

§ из файла, заданного аргументом filename, выполняется с помощью метода load() модуля pickle чтение двоичных данных и преобразование их в список тестов test_list;

§ с помощью метода choice() модуля random из списка test_list осуществляется случайный выбор теста и занесение его содержимого в переменную test;

§ производится удаление этого теста из test_list и запись с помощью метода dump() модуля pickle измененного списка тестов в файл " cur_tests. dat", который отличается от файла " tests. dat" тем, что содержит только те тесты, вкоторые еще не были использованы при тестировании;

§ возвращается содержимое выбранного теста;

· у выбранного теста выделяется его часть, не содержащая эталонное значение, и передается клиенту в следующем виде (см. подраздел 2. 2. 1):

Тест №3. Выполняется удаление существующего файла:
1. mode='w'>
2. mode='w+'
3. mode='a';

· выполняется создание словаря пользователя user_dict и инициализация его элементов:

§ элемент с ключем " name" класса str получает значение имени, переданное клиентом – data['name'][0];

§ элемент с ключем " number_test" класса int, предназначенный для хранения числа переданных клиенту тестов, получает значение 1;

§ элемент с ключем " tests" класса list, предназначенный для хранения тестов, переданных клиенту, получает значение переменной test;

§ элемент с ключем " answers" класса list, предназначенный для хранения ответов пользователя при тестировании, получает пустое значение ([]), поскольку на этом этапе от клиента было получено только имя пользоватея;

§ элемент с ключем " points" класса int, предназначенный для хранения числа набранных баллов получает начальное значение 0.

· текущее состояние словаря пользователя user_dict запоминается в файле 'user. dat';

Если клиентская часть передает значение ответа пользователя, т. е. словарь полученных данных data содержит ключ " answers", то выполняются следующие действия:

· производится считывание из файла 'user. dat' текущего значения словаря данных пользователя и добавление в его элемент с ключем 'answers', хранящий в виде списка ответы пользователя, значение очередного ответа;

· из словаря пользователя выбирается список тестов, заданных пользователю, в нем определяется последний тест и из этого теста берется эталонное значение, которое заносится в переменную etalon;

· производится сравнение полученного от пользователя ответа с эталонным значением и, если ответ правильный, число набранных баллов пользователя увеличивается на 1;

· проверяется текущее значение числа проведенных тестов (элемент " number_test" словаря данных пользователя) с числом тестов, указанных для тестирования (max_test) и, если оно меньше, т. е. тестирование не закончено, то выполняются следующие действия:

§ чтение с помощью функции get_test('cur_tests. dat') модифицированного набора тестов (чтобы тесты не повторялись), случайный выбор одного из них, модификаця файла 'cur_tests. dat' и передача клиенту очередного теста;

§ производится изменение элементов с ключами " number_test" и " tests" словаря пользователя – значение " number_test" увеличивается на 1, к значению " tests" добавляется новый тест;

§ текущее состояние словаря пользователя user_dict запоминается в файле 'user. dat';

· если значение элемента " number_test" равно или больше max_test, то тестирование прекращается и его результаты передаются клиенту с помощью функции write_results() (описание функции см. в подразделе 2. 2. 3):

Результаты тестирования:
Имя – Сидоров Евгений
Оценка – " Отлично"

Оглавление

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...