Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Pytest测试文件是否有效_Python_Python 3.x_Unit Testing_Pytest - Fatal编程技术网

Python 使用Pytest测试文件是否有效

Python 使用Pytest测试文件是否有效,python,python-3.x,unit-testing,pytest,Python,Python 3.x,Unit Testing,Pytest,我是python的新手,对测试知之甚少 背景 我对用python编写代码是全新的,对测试知之甚少。所以,作为第一步,我浏览了文档,了解了如何编写测试。我对什么是夹具以及如何使用猴子补丁等有一个基本的概念。但是我有点困惑,因为我不确定如何测试我的代码,因为网站上给出的示例并不实用 我的代码 class Cache: def __init__(self): pass def get_object_etag(self, s3_path: str, file_name:

我是python的新手,对测试知之甚少

背景

我对用python编写代码是全新的,对测试知之甚少。所以,作为第一步,我浏览了文档,了解了如何编写测试。我对什么是夹具以及如何使用猴子补丁等有一个基本的概念。但是我有点困惑,因为我不确定如何测试我的代码,因为网站上给出的示例并不实用

我的代码

class Cache:
    def __init__(self):
        pass

    def get_object_etag(self, s3_path: str, file_name: str) -> str:
        bucket, key = s3.deconstruct_s3_path(f"{s3_path}/{file_name}")
        return s3_resource().Object(bucket, key).e_tag

    def file_exists(self, local_path: str, file_name: str) -> bool:
        return os.path.exists(f"{local_path}/{file_name}")

    def cache_file(self, s3_path: str, local_path: str, file_name_on_s3: str) -> None:
        etag_value = self.get_object_etag(s3_path, file_name_on_s3)
        local_file_name = "etag_" + etag_value + "_" + file_name_on_s3
        if not self.file_exists(local_path, local_file_name):
            os.makedirs(local_path, exist_ok=True)
            s3.copy_with_python_retry(
                from_path=f"{s3_path}/{file_name_on_s3}",
                to_path=f"{local_path}/{local_file_name}",
            )
        else:
            print("Cached File is Valid")
我想测试缓存文件()函数。此函数将获取s3上的文件路径、本地路径和s3上的文件名,并将etag值附加为名称。在任何给定的时间,我们都可以检查路径/文件是否存在。如果etag已更改,则该文件也将不存在,因为我们构造的本地文件名将无效

测试方法

假设当前我有一个路径foo/myfoo/etag_123_my_file.csv/

现在,假设我转到s3,由于某种原因,etag已更改,因此我的文件名变为
etag_124_my_file.csv
,因此在这种情况下,我将无法通过文件存在检查,并被迫再次下载更新的文件

另一个测试用例是s3上的文件名与本地文件名匹配的理想情况,这意味着缓存的文件是有效的

我对如何测试这一点感到非常困惑,因为我刚刚开始测试pytest,没有测试驱动的心态


例如,我是否使用monkey patch并只设置本地文件名和e标签值之类的属性?如果有人能举个例子,我会很高兴的。这对我开始测试有很大帮助。

如果你模拟所有的S3调用(有或没有框架),你可以模拟
文件\u exists
以返回
False
,并检查是否调用了
S3.copy\u with_python\u retry
,在另一个测试中检查相反的情况(如果
文件\u存在,则不调用
返回
True

下面是一个粗略的示例(不使用任何框架)来说明我的意思:

从unittest导入模拟
导入pytest
从s3cache导入缓存#假设缓存位于s3cache.py中
@pytest.fixture
def s3_mock():
使用mock.patch('s3cache.s3')作为s3#mock:#假设您使用“从boto3导入s3”
产量模拟
@pytest.fixture(autouse=True)
def get_object_mock():
#这只是为了方便起见-您模拟函数,因为您不测试它
#autouse=True表示在所有测试中模拟它
使用mock.patch('s3cache.Cache.get_object_etag')作为对象\u mock:
屈服对象
@mock.patch('os.makedirs')
@mock.patch('s3cache.Cache.file_存在',返回值=False)
def test_s3cache_存在(存在_mock、makedirs_mock、s3_mock):
cache=cache()
#你可以把更合理的价值放在这里
cache.cache\u文件(“我的路径”、“本地路径”、“s3\u fname”)
makedirs\u mock.assert\u使用('local\u path',exist\u ok=True)调用一次
#如果需要,还可以如上所述检查参数
s3_mock.copy_with_python_retry.assert_called_once()
@mock.patch('os.makedirs')
@mock.patch('s3cache.Cache.file_存在',返回值=True)
def测试\u s3cache\u不存在(存在\u mock、makedirs\u mock、s3\u mock):
cache=cache()
cache.cache\u文件(“我的路径”、“本地路径”、“s3\u fname”)
makedirs\u mock.assert\u not\u called()
s3_mock.copy_with_python_retry.assert_not_called()

由于您不想测试S3功能本身,您主要需要检查它是否被正确调用,尽管您必须自己决定到底要测试什么。

测试S3的方法有很多,您可以看看帖子。@Mrbeanbreman非常感谢,本地堆栈看起来很有希望。我可以看看。如果您有som的话e经验如果我想测试cache_文件()的话,你能提供进一步的指导吗函数意味着我的测试应该做什么?明白了,你能提供一个例子并将其作为答案发布吗?我很乐意接受这个答案,因为它会让我开始,然后我可以调整并提出不同的场景,如你所述。再次感谢你的时间和努力。@beanbremen先生我认为另一个更具挑战性的部分是,cache_file()实际上没有显式返回任何内容,因此我不确定如何执行断言?您能否澄清s3cache的用法?我甚至没有该库,并想知道为什么需要它?正如我在评论中所写:“假设缓存在s3cache.py中”。我不知道您的模块是如何调用的,可能只是
cache.py
。这很好,只是最后一个问题。我理解mock.patch的工作原理,它基本上是强制返回值。我想知道下面的assert\u called\u once()和另一个assert\u not\u called()是什么意思这意味着它们的某个地方有文档吗?我想我不会模拟所有东西。我只会模拟文件_exists的返回值,因为其他事情都没有那么烦人,包括进行s3调用。如果是这样的话,我应该如何做断言来检查python重试何时被调用以及何时没有被调用?请参阅
assert_调用方法。至于使用真正的S3进行测试——通常对于单元测试不是一个好主意,但是对于集成测试,你可以这样做。要检查所有调用,你要么模拟调用,要么检查调用的效果。