Merge remote-tracking branch 'refs/remotes/origin/master'
[kivitendo-erp.git] / doc / dokumentation.xml
index b053c3f..25b52d3 100644 (file)
@@ -415,14 +415,17 @@ dbcharset = UTF-8</programlisting>
       <sect2 id="Zeichensätze-die-Verwendung-von-UTF-8">
         <title>Zeichensätze/die Verwendung von UTF-8</title>
 
-        <para>kivitendo kann komplett mit UTF-8 als Zeichensatz verwendet
-        werden. Dabei gibt es zwei Punkte zu beachten: PostgreSQL muss in
-        Version 8.2 oder neuer benutzt werden, und der
-        PostgreSQL-Datenbankcluster muss ebenfalls mit UTF-8 als Locale
-        angelegt worden sein.</para>
+       <para>Bei aktuellen Serverinstallationen braucht man hier meist nicht
+       eingreifen</para>
+
+        <para>Dieses kann überprüft werden: ist das Encoding der Datenbank
+       “template1” “UTF8”, so braucht man nichts weiteres diesbezueglich
+       unternehmen. Zum Testen:
+
+        <programlisting>su postgres
+echo '\l' | psql
+exit </programlisting>
 
-        <para>Dieses ist kann überprüft werden: ist das Encoding der Datenbank
-        “template1” “UTF8”, so kann auch kivitendo mit UTF-8 betrieben werden.
         Andernfalls ist es notwendig, einen neuen Datenbankcluster mit
         UTF-8-Encoding anzulegen und diesen zu verwenden. Unter Debian und
         Ubuntu kann dies z.B. für PostgreSQL 8.2 mit dem folgenden Befehl
@@ -460,14 +463,9 @@ dbcharset = UTF-8</programlisting>
         <para>In der Datei <filename>pg_hba.conf</filename>, die im gleichen
         Verzeichnis wie die <filename>postgresql.conf</filename> zu finden
         sein sollte, müssen die Berichtigungen für den Zugriff geändert
-        werden. Hier gibt es mehrere Möglichkeiten. Eine besteht darin, lokale
-        Verbindungen immer zuzulassen:</para>
-
-        <programlisting>local all all trust
-host all all 127.0.0.1 255.0.0.0 trust</programlisting>
-
-        <para>Besser ist es, für eine bestimmte Datenbank Zugriff nur per
-        Passwort zuzulassen. Beispielsweise:</para>
+       werden. Hier gibt es mehrere Möglichkeiten. sinnvoll ist es nur die
+       nögiten Verbindungen immer zuzulassen, für eine lokal laufenden
+       Datenbank zum Beispiel:</para>
 
         <programlisting>local all kivitendo password
 host all kivitendo 127.0.0.1 255.255.255.255 password</programlisting>
@@ -478,10 +476,14 @@ host all kivitendo 127.0.0.1 255.255.255.255 password</programlisting>
 
         <para>In der Datenbank <literal>template1</literal> muss die
         Unterstützung für servergespeicherte Prozeduren eingerichet werden.
-        Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an, und
+        Melden Sie sich dafür als Benutzer “postgres” an der Datenbank an:
+        <programlisting>su - postgres
+psql template1</programlisting>
+
         führen Sie die folgenden Kommandos aus:</para>
 
-        <programlisting>create language 'plpgsql';</programlisting>
+        <programlisting>create language 'plpgsql';
+\q</programlisting>
       </sect2>
 
       <sect2 id="Datenbankbenutzer-anlegen">
@@ -492,7 +494,9 @@ host all kivitendo 127.0.0.1 255.255.255.255 password</programlisting>
         anlegen. Ein Beispiel, wie Sie einen neuen Benutzer anlegen
         können:</para>
 
-        <programlisting>su - postgres createuser -d -P kivitendo</programlisting>
+             <programlisting>su - postgres
+createuser -d -P kivitendo
+exit</programlisting>
 
         <para>Wenn Sie später einen Datenbankzugriff konfigurieren, verändern
         Sie den evtl. voreingestellten Benutzer “postgres” auf “kivitendo” bzw.
@@ -861,6 +865,22 @@ insserv kivitendo-task-server</programlisting>
         <para>Dieselben Optionen können auch für die SystemV-basierenden
         Runlevel-Scripte benutzt werden (siehe oben).</para>
       </sect2>
+      <sect2 id="Prozesskontrolle2">
+        <title>Task-Server mit mehreren Mandanten</title>
+
+        <para>Beim Task-Server wird der Login-Name des Benutzers, unter dem der
+        Task-Server laufen soll, in die Konfigurationsdatei geschrieben. Hat
+        man mehrere Mandanten muß man auch mehrere Konfigurationsdateien
+        anlegen.</para>
+
+        <para>Die Konfigurationsdatei ist eine Kopie der Datei kivitendo.conf,
+        wo in der Kategorie [task_server] der gewünschte "login" steht.</para>
+
+        <para>Der alternative Task-Server wird dann mit folgendem Befehl
+        gestartet:</para>
+
+        <programlisting>./scripts/task_server.pl -c config/DATEINAME.conf</programlisting>
+      </sect2>
     </sect1>
 
     <sect1 id="Benutzerauthentifizierung-und-Administratorpasswort">
@@ -2193,6 +2213,14 @@ insserv kivitendo-task-server</programlisting>
                 dem Kürzel das im Dateinamen verwendetet wird.</para>
               </listitem>
             </varlistentry>
+
+            <varlistentry>
+              <term><varname>template_meta.tmpfile</varname></term>
+
+              <listitem>
+                <para>Datei-Prefix für temporäre Dateien.</para>
+              </listitem>
+            </varlistentry>
           </variablelist>
         </sect3>
 
@@ -4077,7 +4105,7 @@ insserv kivitendo-task-server</programlisting>
           Mittels <function>!=</function> anstelle von <function>==</function>
           würde auf Ungleichheit getestet.</para>
 
-          <programlisting>%if var1 == var2%&gt;</programlisting>
+          <programlisting>&lt;%if var1 == var2%&gt;</programlisting>
 
           <para>Testet die Variable <varname>var1</varname> auf
           übereinstimmung mit der Variablen <varname>var2</varname>. Mittel
@@ -5401,6 +5429,148 @@ filenames</programlisting>
       </sect2>
     </sect1>
 
+    <sect1 id="devel.testsuite">
+      <title>Die kivitendo-Test-Suite</title>
+
+      <sect2 id="devel.testsuite.intro">
+        <title>Einführung</title>
+
+        <para>kivitendo enthält eine Suite für automatisierte Tests. Sie basiert auf dem Standard-Perl-Modul <literal>Test::More</literal>.</para>
+
+        <para>Die grundlegenden Fakten sind:</para>
+
+        <itemizedlist>
+          <listitem><para>Alle Tests liegen im Unterverzeichnis <filename>t/</filename>.</para></listitem>
+
+          <listitem><para>Ein Script (bzw. ein Test) in <filename>f/</filename> enthält einen oder mehrere Testfälle.</para></listitem>
+
+          <listitem><para>Alle Dateinamen von Tests enden auf <literal>.t</literal>. Es sind selbstständig ausführbare Perl-Scripte.</para></listitem>
+
+          <listitem><para>Die Test-Suite besteht aus der Gesamtheit aller Tests, sprich aller Scripte in <filename>f/</filename>, deren
+          Dateiname auf <literal>.t</literal> endet.</para></listitem>
+        </itemizedlist>
+      </sect2>
+
+      <sect2 id="devel.testsuite.prerequisites">
+        <title>Voraussetzungen</title>
+
+        <para>Für die Ausführung werden neben den für kivitendo eh schon benötigten Module noch weitere Perl-Module benötigt. Diese sind:</para>
+
+        <itemizedlist>
+          <listitem><para><literal>Test::Deep</literal> (Debian-Paketname: <literal>libtest-deep-perl</literal>; Fedora Core:
+          <literal>perl-Test-Deep</literal>; openSuSE: <literal>perl-Test-Deep</literal>)</para></listitem>
+        </itemizedlist>
+      </sect2>
+
+      <sect2 id="devel.testsuite.execution">
+        <title>
+          Existierende Tests ausführen
+        </title>
+
+        <para>Es gibt mehrere Möglichkeiten zum Ausführen der Tests: entweder, man lässt alle Tests auf einmal ausführen, oder man führt
+        gezielt einzelne Scripte aus. Für beide Fälle gibt es das Helferscript <filename>t/test.sh</filename>.</para>
+
+        <para>Will man die komplette Test-Suite ausführen, so muss man einfach nur <filename>t/test.sh</filename> ohne weitere Parameter aus
+        dem kivitendo-Basisverzeichnis heraus ausführen.</para>
+
+        <para>Um einzelne Test-Scripte auszuführen, übergibt man deren Namen an <filename>t/test.sh</filename>. Beispielsweise:</para>
+
+        <programlisting>t/test.sh t/form/format_amount.t t/background_job/known_jobs.t</programlisting>
+      </sect2>
+
+
+      <sect2 id="devel.testsuite.meaning_of_scripts">
+        <title>
+          Bedeutung der verschiedenen Test-Scripte
+        </title>
+
+        <para>Die Test-Suite umfasst Tests sowohl für Funktionen als auch für Programmierstil. Einige besonders zu erwähnende, weil auch
+        während der Entwicklung nützliche Tests sind:</para>
+
+        <itemizedlist>
+          <listitem><para><filename>t/001compile.t</filename> -- compiliert alle Quelldateien und bricht bei Fehlern sofort ab</para></listitem>
+          <listitem><para><filename>t/002goodperl.t</filename> -- überprüft alle Perl-Dateien auf Anwesenheit von '<literal>use strict</literal>'-Anweisungen</para></listitem>
+          <listitem><para><filename>t/003safesys.t</filename> -- überprüft Aufrufe von <function>system()</function> und <function>exec()</function> auf Gültigkeit</para></listitem>
+          <listitem><para><filename>t/005no_tabs.t</filename> -- überprüft, ob Dateien Tab-Zeichen enthalten</para></listitem>
+          <listitem><para><filename>t/006spelling.t</filename> -- sucht nach häufigen Rechtschreibfehlern</para></listitem>
+          <listitem><para><filename>t/011pod.t</filename> -- überprüft die Syntax von Dokumentation im POD-Format auf Gültigkeit</para></listitem>
+        </itemizedlist>
+
+        <para>Weitere Test-Scripte überprüfen primär die Funktionsweise einzelner Funktionen und Module.</para>
+      </sect2>
+
+      <sect2 id="devel.testsuite.create_new">
+        <title>
+          Neue Test-Scripte erstellen
+        </title>
+
+        <para>Es wird sehr gern gesehen, wenn neue Funktionalität auch gleich mit einem Test-Script abgesichert wird. Auch bestehende
+        Funktion darf und soll ausdrücklich nachträglich mit Test-Scripten abgesichert werden.</para>
+
+        <sect3 id="devel.testsuite.ideas_for_non_function_tests">
+          <title>
+            Ideen für neue Test-Scripte, die keine konkreten Funktionen testen
+          </title>
+
+          <para> Ideen, die abgesehen von Funktions noch nicht umgesetzt wurden:</para>
+
+          <itemizedlist>
+            <listitem><para>Überprüfung auf fehlende symbolische Links</para></listitem>
+            <listitem><para>Suche nach Nicht-ASCII-Zeichen in Perl-Code-Dateien (mit gewissen Einschränkungen wie das Erlauben von deutschen Umlauten)</para></listitem>
+            <listitem><para>Test auf DOS-Zeilenenden (\r\n anstelle von nur \n)</para></listitem>
+            <listitem><para>Überprüfung auf Leerzeichen am Ende von Zeilen</para></listitem>
+            <listitem><para>Test, ob alle zu übersetzenden Strings in <filename>locale/de/all</filename> vorhanden sind</para></listitem>
+            <listitem><para>Test, ob alle Webseiten-Templates in <filename>templates/webpages</filename> mit vom Perl-Modul <literal>Template</literal> compiliert werden können</para></listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3 id="devel.testsuite.directory_and_test_names">
+          <title>
+            Konvention für Verzeichnis- und Dateinamen
+          </title>
+
+          <para>Es gibt momentan eine wenige Richtlinien, wie Test-Scripte zu benennen sind. Bitte die folgenden Punkte als Richtlinie betrachten und ihnen soweit es geht folgen:</para>
+
+          <itemizedlist>
+            <listitem><para>Die Dateiendung muss <filename>.t</filename> lauten.</para></listitem>
+
+            <listitem><para>Namen sind englisch, komplett klein geschrieben und einzelne Wörter mit Unterstrichten getrennt (beispielsweise
+            <filename>bad_function_params.t</filename>).</para></listitem>
+
+            <listitem><para>Unterverzeichnisse sollten grob nach dem Themenbereich benannt sind, mit dem sich die Scripte darin befassen
+            (beispielsweise <filename>background_jobs</filename> für Tests rund um Hintergrund-Jobs).</para></listitem>
+
+            <listitem><para>Test-Scripte sollten einen überschaubaren Bereich von Funktionalität testen, der logisch zusammenhängend ist
+            (z.B. nur Tests für eine einzelne Funktion in einem Modul). Lieber mehrere Test-Scripte schreiben.</para></listitem>
+          </itemizedlist>
+        </sect3>
+
+        <sect3 id="devel.testsuite.minimal_example">
+          <title>
+            Minimales Skelett für eigene Scripte
+          </title>
+
+          <para>Der folgenden Programmcode enthält das kleinstmögliche Testscript und kann als Ausgangspunkt für eigene Tests verwendet werden:</para>
+
+          <programlisting>use Test::More tests =&gt; 0;
+
+use lib 't';
+
+use Support::TestSetup;
+
+Support::TestSetup::login();</programlisting>
+
+          <para>Wird eine vollständig initialisierte kivitendo-Umgebung benötigt (Stichwort: alle globalen Variablen wie
+          <varname>$::auth</varname>, <varname>$::form</varname> oder <varname>$::lxdebug</varname>), so muss in der Konfigurationsdatei
+          <filename>config/kivitendo.conf</filename> im Abschnitt <literal>testing.login</literal> ein gültiger Login-Name eingetragen
+          sein. Dieser wird für die Datenbankverbindung benötigt.</para>
+
+          <para>Wir keine vollständig initialisierte Umgebung benötigt, so kann die letzte Zeile <code>Support::TestSetup::login();</code>
+          weggelassen werden, was die Ausführungszeit des Scripts leicht verringert.</para>
+        </sect3>
+      </sect2>
+    </sect1>
+
     <sect1 id="devel.style-guide">
       <title>Stil-Richtlinien</title>