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)) 

上記細かい実行され、期待される出力を出力します。

+0

失敗したテストケースの内部でコードを取得し、それを(必要なインポートと一緒に)ファイルに入れて実行するとどうなりますか? – BrenBarn

+0

どのようにクリプトパルをインストールしましたか?それはPyPi上ではありませんか? – Eddie

+0

@Eddie cryptopalsは、両方のファイルと同じディレクトリにある自分の.pyファイルです。 –

答えて

2

問題は、私はさまざまな方法で2つのスクリプトを実行していたということです。

$ python s1c5.py 

$ python s1c6.py s1c6.txt 

unittest.main()は、コマンドライン引数を解析しているので、後者の場合にエラーがあります。最初のプログラムにコマンドライン引数を渡すと、同じエラーが発生します。

関連する問題