1
Pythonでいくつかの練習問題を解決し、unittestを使用してコードの検証を自動化しています。 1つのプログラムが単体テストを実行し、それが成功します。第二には、次のエラーを与える:__main__からのunittestsのコマンドライン呼び出しが失敗する
$ 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)
は、ここでの作業スクリプトのコードです:
# 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()
し、障害のスクリプトのコード:私は基本的に表示されていない
# 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()
これらの2つのプログラムの違いは、一方ではエラーを引き起こし、他方ではエラーではありません。私は何が欠けていますか?
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))
スクリプトの失敗の "生" のバージョン:
# 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))
上記細かい実行され、期待される出力を出力します。
失敗したテストケースの内部でコードを取得し、それを(必要なインポートと一緒に)ファイルに入れて実行するとどうなりますか? – BrenBarn
どのようにクリプトパルをインストールしましたか?それはPyPi上ではありませんか? – Eddie
@Eddie cryptopalsは、両方のファイルと同じディレクトリにある自分の.pyファイルです。 –