单元测试失败后,只读Python文件

时间:2019-04-15 20:30:10

标签: python python-unittest

我正在尝试创建一个单元测试来测试以下功能:

    def decrypt_keys(self, enc_password):
        with open ('id_rsa','r') as privkeyfile:
            pem_key = privkeyfile.read()
            print(pem_key)
            priv = rsa.PrivateKey.load_pkcs1(pem_key)
        return rsa.decrypt(base64.b64decode(bytes(enc_password, 'utf-8')),priv).decode('utf-8')

但是,单元测试失败并显示以下错误:

ValueError: No PEM start marker "b'-----BEGIN RSA PRIVATE KEY-----'" found

----------------------------------------------------------------------
Ran 1 test in 0.012s

FAILED (errors=1)
b'-----BEGIN RSA PRIVATE KEY-----
 ... rest of private key here ...
-----END RSA PRIVATE KEY-----'

紧接着,可以看到,文件的内容将按照库的预期进行打印。在函数尝试将其作为rsa密钥加载之前,如何确保完全读取文件?

1 个答案:

答案 0 :(得分:3)

您的文件中似乎包含Python二进制字符串引号,由于它不知道如何解释私钥周围的b'...',因此破坏了RSA读取代码。

我建议在文本编辑器中打开私钥文件并删除这些标记。您可能还想调查文件的写入位置,并在代码的其他部分对其进行修复。当您应该调用str方法(例如bytes)时,您可能在decode对象上调用binary_key_text.decode()。或者,可以在编写文件时以二进制模式('wb')打开文件,然后直接编写bytes对象。

您也许可以在阅读Python代码时解决此问题(使用类似pem_key = pem_key[2:-1]的方法,先删除前两个字符,最后一个字符)。但是,如果将其添加到代码中,则它仅适用于误写的文件,而不适用于普通文件。这就是将错误包含在软件中的方式,以便将来无法修复! (我想您可以用if pem_key.startswith("b'") and pem_key.endswith("'")保护切片操作,但是如果有问题的文件编写代码已经广泛发布,并且您确实需要保证向后兼容,我将不为所动。)