Datei helper test.dart
Zur Navigation springen
Zur Suche springen
Link
[Bearbeiten]Zielsetzung
[Bearbeiten]Die Datei helper_test.dart enthält die Unittests der Datei helper.dart.
Für jede Funktion aus helper.dart existiert mindestens ein Test.
Import
[Bearbeiten]import 'dart:io'; import 'package:dgrep/helper.dart'; import 'package:test/test.dart'; import 'package:args/args.dart'; import 'package:path/path.dart' as path;
import 'package:dgrep/helper.dart';Damit kennt der Parser die Definitionen aus helper.dart.- Die anderen Importe betreffen das interne Paket
dart:iound die externen Paketeargs,testundpath. import 'package:path/path.dart' as path;- Es gibt folgendes Problem: die Pakete test und path enthalten jeweils eine Funktion
equals(). - Zur Auflösung des Konflikts wird der Zugriffsname
path(hinter as) definiert, das bedeutet dass alle Zugriffen auf Namen aus dem Paket mit einempath.erfolgen müssen, beispielsweisepath.join(). - Der Zugriffsname könnte auch
blablaheißen, per Konvention wird aber der Paketname verwendet.
- Es gibt folgendes Problem: die Pakete test und path enthalten jeweils eine Funktion
Die Tests
[Bearbeiten]void main() {
group('argument handling', () {
test('testIntArguments', () {
final parser = ArgParser();
parser.addOption('count');
parser.addOption('positive-number');
parser.addFlag('recursive');
final result = parser
.parse(['--positive-number', '33', '--recursive', '--count=nix']);
var message;
expect(
testIntArguments(
result, ['positive-number'], (error) => message = error),
true);
expect(
testIntArguments(
result, ['positive-number', 'count'], (error) => message = error),
false);
expect(message, contains('count is not an integer: nix'));
});
test('testRegExpArguments', () {
...
});
});
test('regExpEscape', () {
expect(regExpEscape('()[]{}?*+-|^\$\\.&~# '), equals('\\(\\)\\[\\]\\{\\}\\?\\*\\+\\-\\|\\^\\\$\\\\\\.\\&\\~\\#\\ '));
expect(regExpEscape('abc.123'), equals(r'abc\.123'));
expect(regExpEscape(''), equals(r''));
expect(regExpEscape(null), isNull);
});
...
}
group('argument handling', () {Es wird eine Gruppe definiert, die laut Beschreibung die Argumentbehandlung testet, das sind zwei FunktionentestIntArguments()undtestRegExpArguments().final parser = ArgParser();Damit beginnt die Vorbereitung auf den Test: einArgParser-Objekt wird instantiiert.- Es werden drei Optionen eingetragen, eines davon ist ein Flag (Boolsche Option).
result = parser.parse(['--positive-number', '33', '--recursive', '--count=nix']);- Der Parser untersucht die übergebene Argumentliste auf Optionen.
- Das Ergebnis ist ein Objekt vom Typ
ArgResults, das als Parameter für die zu testenden FunktionentestIntArguments()undtestRegExpArguments()gebraucht wird.
- Damit ist die Vorbereitung eines "vernünftigen" Tests fertig.
- Die Funktion
expect()hat als ersten Parameter den zu testenden Wert, als zweiten den erwarteten Wert.- Wir testen den Aufruf von
testIntArguments()und erwarten den Werttrue, da die Option "--positive-number" korrekt benutzt wurde. - Im zweiten Aufruf wird mit dem Parameter
counteine Option getestet, die mit dem Stringnixfalsch vewendet wurde, wir erwarten also als Funktionsergebnis vontestIntArgumentsden Wertfalse.
- Wir testen den Aufruf von
- Der dritte Parameter von
testIntArguments()ist eine Callbackfunktion, die eine Fehlermeldung als Parameter übergeben bekommt. In unserem Test speichern wir diese Meldung in der lokalen Variablenmessage. expect(message, contains('excluded: error in regular expression'));- Hier wird die obige Variable auf die korrekte Fehlermeldung untersucht.
- Nach der Gruppe folgen Tests, die keine Gruppe haben. Das ist korrekt.
- Der erste Test außerhalb der Gruppe hat die Beschreibung 'regExpEscape'.
- Zuerst werden alle Metazeichen auf einmal getestet, ob alle mit dem vorausgehenden Gegenstrich markiert werden.
- Danach folgt der Test von einem gängigen Beispiel mit und ohne Metazeichen.
- Es folgen zwei Tests mit Grenzbereichen, dem Leerstring als Parameter und der
null. - Es folgen Tests nach dem gleichen Schema.
Der Test von isBinary() ist deshalb interessant, weil hier erst mal Daten für den Test erstellt werden müssen: Wie schreibe ich binäre Daten in eine Datei?
test('isBinary', () {
final base = path.join(Directory.systemTemp.path, 'helper');
final file1 = path.join(base, 'notBinary.01');
writeString(file1, string: 'abc\r\n\t\f');
expect(isBinary(file1), isFalse);
final file2 = File(path.join(base, 'binary.02'));
final handle1 = file2.openSync(mode: FileMode.write);
handle1.writeByteSync(0);
handle1.writeByteSync(33);
handle1.closeSync();
expect(isBinary(file2.path), isTrue);
final file3 = File(path.join(base, 'binary.02'));
final handle2 = file3.openSync(mode: FileMode.write);
for (var no = 1; no < 32; no++) {
handle2.writeByteSync(no);
}
handle2.closeSync();
expect(isBinary(file3.path), isTrue);
});
final base = path.join(Directory.systemTemp.path, 'helper');Damit der Test plattformunabhängig ist, also unter Linux und Windows funktioniert, fragen wir mitDirectory.systemTemp.pathden Namen des temporären Verzeichnisses ab, unter Linux ist das '/tmp', unter Windows c:\temp oder ähnliches. Dieses Verzeichnis wird mit der Funktionjoin()mit dem Unterverzeichnis namenshelperergänzt, so dass inbasedann unter Linux/tmp/helperund unter Windowsc:\temp\helpersteht.final file1 = path.join(base, 'notBinary.01');mit der Funktionjoinaus dem Paketpathsetzen wir plattformunabhängig einen Dateinamen aus Verzeichnis und Namen zusammen.writeString(file1, string: 'abc\r\n\t\f');schreibt einen normalen Text in eine Datei (siehe Datei helper.dart).expect(isBinary(file1), isFalse);Eine normale Textdatei ist nicht binär, wir erwarten als Ergebnis alsofalse.final handle1 = file2.openSync(mode: FileMode.write);Damit öffnen wir eine Datei zum Schreiben.handle1.writeByteSync(0);Wir schreiben das Byte0in die Datei, danach noch ein weiteres Byte mit der Nummer 33 (das ist das Ausrufezeichen).handle1.closeSync();Wer eine Datei öffnet, muss sie auch schließen, sonst werden Resourcen nicht freigegeben.- Jetzt habe wir eine binäre Datei, die wir testen können.
expect(isBinary(file2.path), isTrue); - Nach unserer Definition liegt auch dann eine Binärdatei vor, wenn mehr als 25% der Zeichen Kontrollzeichen sind.
for (var no = 1; no < 32; no++)Mit dieser Schleife schreiben wir 30 Zeichen, die meisten Kontrollzeichen, in die zweite Datei.