ОРГАНИЗАЦИЯ ТЕСТИРОВАНИЯ ПРОГРАММ ИЗ ФАЙЛОВ ПОДГОТОВКА ДАННЫХ При тестировании программ с большим количеством входных да...
16 downloads
148 Views
281KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
ОРГАНИЗАЦИЯ ТЕСТИРОВАНИЯ ПРОГРАММ ИЗ ФАЙЛОВ ПОДГОТОВКА ДАННЫХ При тестировании программ с большим количеством входных данных обычно не используется ручной ввод. Исходная информация заранее заносится в файлы, из которых производится считывание во время выполнения программы. Результаты работы тоже записываются в файлы в виде подробного отчета по каждому тесту. Входные и выходные файлы могут иметь текстовый формат, тогда их удобно создавать и читать. Тестовые входные данные записываются в файл в редакторе, поддерживающем чисто текстовый формат данных. Это может быть Блокнот, встроенный редактор Far, Word с указанием типа файла «Обычный текст», встроенный редактор среды разработки Borland Pascal. Занесение данных в файл делается по тем же правилам и в том же порядке, что и набор с клавиатуры при ручном тестировании. Каждый тест можно записать в отдельный файл или создать один файл на все тесты вместе. Преимущество отдельных файлов в том, что результаты работы программы с одним тестом никак не влияют на работу этой программы с другими тестами. Если же все тесты помещены в один файл, то ошибка во время выполнения программы (Runtime Error) для одного теста не позволит проверить другие, поскольку выполнение будет закончено досрочно. С другой стороны, преимущество единого файла заключается в том, что не нужно решать проблему указания разных имен файлов с тестами. Результаты работы программы с каждым тестом так же можно помещать в отдельный файл или дописывать их в единый файл результатов. Эти файлы оформляются в формате полного отчета о работе программы: для каждого теста сначала приводятся входные данные, а потом получившийся результат.
ПРОГРАММНАЯ РЕАЛИЗАЦИЯ 1. Перенаправление ввода-вывода. Готовая к исполнению программа, хранящаяся в файле .exe, может быть запущена из командной строки. Если в этой программе не подключается библиотека Crt, то стандартный ввод с клавиатуры и вывод на экран можно заменить вводом из текстового файла и выводом в файл, используя специальные обозначения в командной строке. Пусть программа, в которой организован стандартный ввод и вывод, находится в файле ProdMatr.exe, входные данные – в файле InpFile.txt, а результаты работы программы требуется записать в выходной файл OutFile.txt, все файлы – в одной папке. Тогда командная строка примет вид: ProdMatr.exe < InpFile.txt > OutFile.txt Здесь знак < означает чтение данных из файла InpFile.txt, а знак > означает направление результатов в файл OutFile.txt (иными словами, стандартные файлы ввода/вывода Input/Output заменяются соответственно конструкциями < InpFile.txt и > OutFile.txt). Для файлов, находящихся в разных папках, следует указывать полный путь. Информация, хранившаяся ранее в файле OutFile.txt, будет стерта. Если каждый тест находится в отдельном файле, то указанную команду нужно будет выполнить несколько раз, меняя имя файла с данными. Все результаты можно направлять в один выходной файл, применяя конструкцию >> OutFile.txt, которая означает дописывание новой информации в конец файла.
Пример 1.1. Выполнение программы с перенаправлением стандартного ввода на чтение из трех файлов с тестами и выводом всех результатов в один файл. Перечисленные ниже команды выполняются из командной строки: ProdMatr.exe < InpFile1.txt > OutFile.txt ProdMatr.exe < InpFile2.txt >> OutFile.txt ProdMatr.exe < InpFile3.txt >> OutFile.txt
Пример 1.2. Создание командного файла для тестирования. Для того чтобы не набирать команды каждый раз, можно заранее записать их последовательность в командный файл и затем исполнять его. В текстовом редакторе создается файл ProdMatr.bat, в нем перечисляются команды, которые нужно выполнить для тестирования программы ProdMatr.exe: @echo off – отключение вывода текста команд на экран ProdMatr.exe OutFile.txt ProdMatr.exe < InpFile2.txt >> OutFile.txt ProdMatr.exe < InpFile3.txt >> OutFile.txt ЗАМЕЧАНИЕ. В программе нельзя использовать библиотеку Crt, в противном случае перенаправления ввода/вывода не будет.
2. Использование файлов в программе. Программирование работы с файлом разделяется на 3 этапа: открытие, чтение или запись, закрытие. Для выполнения этих действий в языке Паскаль имеются специальные встроенные процедуры. ОТКРЫТИЕ Файл, именованная совокупность данных на внешнем носителе, формируется как последовательность компонент (записей) определенного типа. Организация работы с файлом из программы начинается с назначения ему переменной. Все обращения к файлу из программы выполняются с помощью этой переменной. Как любая переменная она должна быть объявлена с определенным типом. Для текстовых файлов – это тип Text, для двоичных – File of Тип_Компонента. В Паскале предусмотрены два стандартных имени для текстовых файлов, их не нужно объявлять: Input для ввода (по умолчанию – с клавиатуры), Output для вывода (по умолчанию – на экран). Если эти переменные назначить другим файлам, то клавиатурный ввод и вывод на экран во время выполнения программы станут недоступными. Назначение переменной файлу выполняет процедура Assign (файловая переменная, имя файла) Имя файла – параметр типа String. Его значение – имя и расширение файла с данными. Если исполняемый файл и файл с данными находятся в разных папках, то в этой строке должен указываться путь к файлу и его имя с расширением. После того, как файлу назначена переменная, его можно открыть. Открытие файла производится с помощью процедур: Reset (файловая переменная) или Rewrite (файловая переменная) или Append (файловая переменная) Если файл уже существует, то используется Reset. К файлу, открытому таким образом, можно применять операции чтения и записи. Открытие файла для создания как нового выполняется процедурой Rewrite. В файл, открытый таким образом, можно записывать
информацию. Если применить Rewrite к существующему файлу, то его содержимое будет потеряно. Открытие существующего файла с целью дозаписи новых компонентов в конец файла выполняется процедурой Append. ЗАМЕЧАНИЕ. После открытия файла процедурами Reset или Rewrite доступным для чтения или записи становится первый компонент. После открытия файла процедурой Append можно записывать новый компонент в конец файла.
Пример 2.1. Открытие готового файла с тестовыми входными данными и создание файла для записи результатов. Исполняемый файл и файлы с данными находятся в одной папке. Пусть входные данные записаны в текстовый файл с именем INDATA.TST, а результаты нужно занести и сохранить в текстовом файле OUTDATA.REZ. Для работы с этими файлами понадобятся 2 файловые переменные: Var InFile, OutFile : Text; В начальных операторах программы файлам нужно назначить переменные: Assign (InFile, ‘INDATA.TST’); Assign (OutFile, ‘OUTDATA.REZ’); После этого файлы можно открыть: Reset (InFile); Rewrite (OutFile);
Пример 2.2. Открытие готового файла с тестовыми входными данными и готового файла с результатами предыдущих сеансов тестирования. Новые результаты требуется дописать в конец файла. Исполняемый файл и файлы с данными находятся в одной папке. Пусть входные данные записаны в текстовый файл с именем INDATA.TST, а результаты – в текстовый файл OUTDATA.REZ. Для работы с этими файлами понадобятся 2 файловые переменные: Var InFile, OutFile : Text; В начальных операторах программы файлам нужно назначить переменные: Assign (InFile, ‘INDATA.TST’); Assign (OutFile, ‘OUTDATA.REZ’); После этого файлы можно открыть: Reset (InFile); Append (OutFile); ЧТЕНИЕ/ЗАПИСЬ Чтение – копирование информации из файла в указанную область оперативной памяти. Запись – копирование информации из указанной области оперативной памяти в файл. Эти операции выполняются с помощью процедур: Read (файловая переменная, список переменных) – чтение, Readln (файловая переменная, список переменных) – чтение, Write (файловая переменная, список значений или переменных) – запись, Writeln (файловая переменная, список значений или переменных) – запись. При каждом вызове одной из этих процедур производится считывание или запись одного текущего компонента файла. После вызова текущим становится следующий, соседний компонент.
Пример 2.3. Чтение файла, содержащего известное количество компонентов, и запись их в другой файл. Пусть во входном файле записано K компонентов. Будем использовать соглашения по поводу имен файлов и переменных, принятые в предыдущих примерах. Var InFile, OutFile : Text; ... Assign (InFile, ‘INDATA.TST’); Assign (OutFile, ‘OUTDATA.REZ’); ... Reset (InFile); Rewrite (OutFile); ... Операции чтения и записи должны выполниться K раз. For I:=1 To K Do Begin Read (InFile, адрес_ОЗУ); Write (OutFile, адрес_ОЗУ); End;
Пример 2.4. Чтение файла, содержащего неизвестное количество компонентов, и запись их в другой файл. Для проверки конца файла используется встроенная функция: Eof (файловая переменная) Она возвращает значение False, если файловая переменная указывает на очередной компонент, и значение True, если файл закончился. Будем использовать соглашения по поводу имен файлов и переменных, принятые в предыдущих примерах. Var InFile, OutFile : Text; ... Assign (InFile, ‘INDATA.TST’); Assign (OutFile, ‘OUTDATA.REZ’); ... Reset (InFile); Rewrite (OutFile); ... Операции чтения и записи должны выполняться до тех пор, пока из входного файла не будет прочитана вся информация. While Not Eof(InFile) Do Begin Read (InFile, адрес_ОЗУ); Write (OutFile, адрес_ОЗУ); End; ЗАКРЫТИЕ После завершения работы с файлом его следует закрыть, т.е. разорвать связь между файловой переменной и данными на внешнем носителе. Эти действия выполняет процедура: Close (файловая переменная) Если данная процедура не используется, то файл закроется во время завершения выполнения программы, однако такое некорректное закрытие может привести к потере данных.
Пример 2.5. Закрытие файлов перед завершением работы программы.
Пусть в начальных операторах программы файлам были назначены переменные: Assign (InFile, ‘INDATA.TST’); Assign (OutFile, ‘OUTDATA.REZ’); В последних операторах программы эти файлы нужно закрыть: Close (InFile); Close (OutFile);
Пример 2.6. Закрытие файла для освобождения файловой переменной. Пусть входные данные разбиты на 2 части и каждая часть записана в отдельный текстовый файл. Имена файлов INDATA1.TST и INDATA2.TST. Результаты тестирования заносятся в текстовый файл OUTDATA.REZ. Для работы с этими файлами можно использовать 2 файловые переменные: Var InFile, OutFile : Text; В начальных операторах программы выполняется назначение переменной для выходного файла и этот файл открывается: Assign (OutFile, ‘OUTDATA.REZ’); Rewrite (OutFile); Затем следует назначение, открытие и чтение из первого файла с исходными данными: Assign (InFile, ‘INDATA1.TST’); Reset (InFile); ... Read (InFile, адрес1_ОЗУ); ... Когда данные из файла будут полностью прочитаны, его следует закрыть: Close (InFile); После этого может следовать назначение, открытие и чтение из второго файла с исходными данными: Assign (InFile, ‘INDATA2.TST’); Reset (InFile); ... Read (InFile, адрес1_ОЗУ); ... В конце программы результаты записываются в выходной файл и оба файла закрываются: Write (OutFile, адрес2_ОЗУ); ... Close (InFile); Close (OutFile);
3. Программа с вводом имен файлов во время выполнения. В процедуре Assign имя файла задается как параметр строкового типа. При вызове можно указывать строковую константу (последовательность символов, заключенную в апострофы) или строковую переменную. Значение этой переменной до вызова Assign можно задать в операторе присваивания или ввести с клавиатуры.
Пример 3.1. Ввод имен файлов с исходными данными и результатами во время выполнения программы. Исполняемый файл и файлы с данными находятся в одной папке. Var InName, OutName : String;
... Read (InName); Read (OutName);
{ввод имени входного файла с клавиатуры: INDATA.TST} {ввод имени выходного файла с клавиатуры: OUTDATA.REZ} Assign (InFile, InName); Assign (OutFile, OutName); ...
Пример 3.2. Ввод имен файлов с исходными данными и результатами во время выполнения программы. Исполняемый файл находится в одной папке, а файлы с данными – в другой. Поскольку путь к файлам с данными не меняется, его можно задать в программе строковой константой. Полное наименование файла формируется путем конкатенации пути и введенного имени файла. Var InName, OutName, Folder : String; ... Folder := ‘H:\SEM2\TESTS\‘; {путь к файлам с данными} Read (InName); {ввод имени входного файла с клавиатуры: INDATA.TST} Read (OutName); {ввод имени выходного файла с клавиатуры: OUTDATA.REZ} InName := Folder + InName; {полное наименование файла} OutName := Folder + OutName; Assign (InFile, InName); Assign (OutFile, OutName); ...
4. Чередование стандартного и файлового ввода/вывода. В программе, которая будет тестироваться из файлов, можно предусмотреть диалог с пользователем во время выполнения.
Пример 4.1. Тестовые входные данные записаны в нескольких разных файлах. Все результаты требуется поместить в один выходной файл. Var InName, OutName : String; ... Writeln (‘Введите имя выходного файла’); {вывод на экран} Read (OutName); {ввод с клавиатуры} Assign (OutFile, OutName); Rewrite (OutFile); ... While есть тесты Do Begin Writeln (‘Введите имя входного файла’); {вывод на экран} Read (InName); {ввод с клавиатуры} Assign (InFile, InName); Reset (InFile); ... Read (InFile, адрес1_ОЗУ); {ввод из файла} ... Write (OutFile, адрес2_ОЗУ); {вывод в файл} ...
Close (InFile); Writeln (‘Еще есть тест?’); Readln (Да/Нет); End; Close (OutFile);
{вывод на экран} {ввод с клавиатуры}