Testen meines Programms "MergeSort" mit Unitcode schlägt fehl

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Cr0issant
User
Beiträge: 1
Registriert: Montag 12. November 2018, 21:06

Montag 12. November 2018, 21:46

Hallo,

in der Uni haben wir die Aufgabe bekommen ein Programm in python 3 zu schreiben, welches die relativ bekannte Funktion MergeSort (Sortieren einer Liste durch Rekursion und zerteilen der liste in immer kleinere Stücke) implementiert.
Ein solches Programm habe ich geschrieben und es funktioniert auch einwandfrei:

Code: Alles auswählen

import math

#Appender fuegt alle Eintraege aus Liste L ab dem Eintrag k der Reihe nach in Liste C ein
def Appender(C,L,k):
	for z in range(k,len(L)):
		C.append(L[z])
		

#Merge fuegt die vorsortierten Listen A und B so zusammen, dass die Eintraege in C der Groeße nach geordnet sind
def Merge(A,B):
	L = []
	i=0
	j=0
	for k in range((len(A)+len(B))):
		if A[i] < B[j]:
			L.append(A[i])
			if i < (len(A)-1):
				i=i+1
			else:
				#fuegt den Rest von Liste B an, wenn Liste A bereits komplett in L ist
				Appender(L,B,j)
				break
		else:
			L.append(B[j])
			if j < (len(B)-1):
				j=j+1
			else:
				#fuegt den Rest von Liste A an, wenn Liste B bereits komplett in L ist
				Appender(L,A,i)
				break
	return L


def mergeSort(L):
	'''implements merge sort for a list L'''
	print("Splitting",L)
	r = len(L)
	B = []
	C = []
	if len(L) <= 1:
		return L
	if r>1:
		m = math.ceil(r/2)
		B = L[:m]
		C = L[m:]
		B = mergeSort(B)
		C = mergeSort(C)
	L = Merge(B,C)
	return L
Nun hat die Uni dazu noch ein Testprogramm geliefert , dieses wird verwendet um zu testen ob das geschriebene Programm genau das macht was es soll:

Code: Alles auswählen

import unittest
import random
from io import StringIO
from unittest.mock import patch

from mergeSort import mergeSort
from mergeSort import Merge
from mergeSort import Appender


class TestMergeSort(unittest.TestCase):
    def testSplitting(self):
        with patch('sys.stdout', new=StringIO()) as fakeOutput:
            expected = 'Splitting [5, 3, 2, 1]\nSplitting [5, 3]\nSplitting [5]\n'
            expected += 'Splitting [3]\nSplitting [2, 1]\nSplitting [2]\nSplitting [1]\n'
            mergeSort([5,3,2,1])
            self.assertEqual(fakeOutput.getvalue(), expected)

    def testInverted(self):
        actual = list(reversed(range(9)))
        expected = sorted(actual[:])

        print("Sorting {0}".format(actual))
        mergeSort(actual)
        self.assertEqual(expected, actual)

if __name__ == '__main__':
    unittest.main(verbosity=2)

Wenn ich dieses ausführe sagt es mir allerdings, dass der Test failed ist.
Ich bin mir ziemlich sicher, dass dies an der Variablenbezeichnung /Funktionsbezeichnung innerhalb meines Programmes liegt.

Dass mein Code weder Laufzeitschonend noch "schön" geschrieben ist, ist mir an der Stelle erstmal zweitrangig.


Mit freundlich Grüßen
Cr0issant
Antworten