1

Ich löse einige Übungen in Python und benutze unittest, um einen Teil der Verifikation meines Codes zu automatisieren. Ein Programm führt den einzelnen Unitest gut aus und es passiert. Die zweite gibt den folgenden Fehler:Kommandozeilenaufruf von Unit Tests von __main__ fehlgeschlagen

$ python s1c6.py 
E 
====================================================================== 
ERROR: s1c6 (unittest.loader._FailedTest) 
---------------------------------------------------------------------- 
AttributeError: module '__main__' has no attribute 's1c6' 

---------------------------------------------------------------------- 
Ran 1 test in 0.001s 

FAILED (errors=1) 

Hier ist der Code für das Arbeitsskript:

# s1c5.py 
import unittest 

import cryptopals 


class TestRepeatingKeyXor(unittest.TestCase): 
    def testCase(self): 
     key = b"ICE" 
     data = b"Burning 'em, if you ain't quick and nimble\nI go crazy when I hear a cymbal" 
     expected = bytes.fromhex(
      "0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f") 
     self.assertEqual(expected, cryptopals.xorcrypt(key, data)) 


if __name__ == "__main__": 
    unittest.main() 

Und der Code für das fehlerhafte Skript:

# s1c6.py 
import unittest 
import bitstring 

import cryptopals 


class TestHammingDistance(unittest.TestCase): 
    def testCase(self): 
     str1 = b'this is a test' 
     str2 = b'wokka wokka!!!' 
     expected = 37 
     self.assertEqual(expected, hamming_distance(str1, str2)) 


def hamming_distance(str1, str2): 
    temp = cryptopals.xor(str1, str2) 
    return sum(bitstring.Bits(temp)) 


if __name__ == "__main__": 
    unittest.main() 

Ich sehe nicht ein fundamentales Unterschied zwischen diesen beiden Programmen, die einen Fehler in der einen und nicht in der anderen verursachen würde. Was vermisse ich?

import itertools 
import operator 


def xor(a, b): 
    return bytes(map(operator.xor, a, b)) 


def xorcrypt(key, cipher): 
    return b''.join(xor(key, x) for x in grouper(cipher, len(key))) 


def grouper(iterable, n): 
    it = iter(iterable) 
    group = tuple(itertools.islice(it, n)) 
    while group: 
     yield group 
     group = tuple(itertools.islice(it, n)) 

"Raw" -Version Fehler Skript:

# s1c6_raw.py 
import cryptopals 

key = b"ICE" 
data = b"Burning 'em, if you ain't quick and nimble\nI go crazy when I hear a cymbal" 
expected = bytes.fromhex(
    "0b3637272a2b2e63622c2e69692a23693a2a3c6324202d623d63343c2a26226324272765272a282b2f20430a652e2c652a3124333a653e2b2027630c692b20283165286326302e27282f") 
print(cryptopals.xorcrypt(key, data)) 

Die oben läuft gut und druckt die erwartete Ausgabe.

+0

Was passiert, wenn Sie den Code innerhalb des fehlerhaften Testfalls nehmen, ihn in einer Datei selbst (zusammen mit den notwendigen Importen) ablegen und ausführen? – BrenBarn

+0

Wie haben Sie Kryptopale installiert? Es ist nicht auf PyPi, oder? – Eddie

+0

@Eddie crytopals ist meine eigene .py-Datei im selben Verzeichnis wie die beiden gezeigten. –

Antwort

2

Das Problem ist, dass ich die beiden Skripte auf unterschiedliche Weise ausgeführt wurde:

$ python s1c5.py 

und

$ python s1c6.py s1c6.txt 

Da unittest.main() Befehlszeilenargumente analysiert, gibt es einen Fehler im zweiten Fall. Wenn ich ein Befehlszeilenargument an das erste Programm übergebe, bekomme ich auch den gleichen Fehler.