Testen


Um zu verhindern, dass neue Änderungen ältere funktionalität unerwartet beeinflussen, können diese Spezifikationen automatisch überprüft werden.

Hierzu muss unittest und odoo.tests.common importiert werden.

import
import unittest
import odoo.tests.common as common



Tests müssen von TransactionCode erben.

class test_res_partner(common.TransactionCase):



Um den Block der Tests sichtbar zu machen werden setUpClass und tearDownClass benutzt.

setUpClass wird vor allen Tests in der Klasse aufgerufen und tearDownClass danach.

@classmethod
def setUpClass(cls):
	print "-- EQ-UNITTESTS - test_res_partner - START ---"

@classmethod
def tearDownClass(cls):
	print "-- EQ-UNITTESTS - test_res_partner - END ---"



Zum testen einer Methode wird diese aufgerufen und dann überprüft ob sie den erwarteten Wert zurückgibt.


def test_function_get_one(self):
	# Test der Funktion function_get_one()
	record = self.env['res.partner']
	result = record.function_get_one()
	self.assertEqual(result, 1) # stimmt Ergebnis ?


Der obere Test überprüft die Methode function_get_one(). record bekommt ein Objekt vom Modell res.partner zugewiesen.
Mit diesem Objekt wird dann zu überprüfende Methode aufgerufen. Die letzte Zeile vergleicht den Rückgabewert mit der
erwarteten 1. Ist dies korrekt so gilt der Test als bestanden ansonsten wird eine Fehlermeldung ausgegeben.


def test_function_plus(self):
	# Test der Funktion function_plus()
	record = self.env['res.partner']
	result = record.function_plus(5, 3)
	self.assertEqual(result, 8, "Fehler in der Berechnung!") # stimmt Ergebnis ?


Es können auch mehrere Bedingungen gleichzeitig abgefragt werden. Im untern Fall id und name. Stimmt die ID nicht wird der
string "ID stimmt nicht!" ausgegeben.

def test_get_partner_by_id(self):
	# Test der Funktion get_partner_by_id()
	record = self.env['res.partner']
	partner_id = 7
	result = record.get_partner_by_id(partner_id)
	self.assertEqual(result.id, partner_id, "ID stimmt nicht!") # stimmt ID ?
	self.assertEqual(result.name, 'CMC Klebetechnik GmbH', "Name stimmt nicht!") # stimmt Name ?



Tests können auch übersprungen werden. Hierzu wird der Dekorator @unittest.skip verwendet.


@unittest.skip("SKIPPING THIS TEST")
def test_function_two_test_fail(self):
	# Test der Funktion function_two(), die einen Wert 2 zurückliefern soll aber in diesem Fall wollen wir einen FAIL erreichen
	record = self.env['res.partner']
	result = record.function_get_one()
	self.assertEqual(result, 9, "Wrong result from function_two()") # hier wollen wir mit Absicht einen FAIL erreichen

def test_function_minus(self):
	# Test der Funktion function_minus()
	record = self.env['res.partner']
	result = record.function_minus(5, 3)
	self.assertEqual(result, 2)


Um die Tests eines bestimmten Moduls zu starten wird beim Serverstart folgendes anghängt.

-u test_module --test-enable