处理大量测试数据文件时的运行问题

1 投票
2 回答
755 浏览
提问于 2025-04-16 07:48

我想为一个网页抓取工具写一些测试。我需要用到很多测试网页,但我不太确定怎么用nose(或者其他单元测试框架)来实现我的需求,而不写一大堆重复的代码。

我的问题是,我想测试很多不同的网页,但不知道怎么用nose来做到这一点。大概我想做的就是这样:

class TestPage(object):
    def setup(self):
        with open('test_data/page.html', 'r') as f:
            html = f.read()
        self.scraper = Scraper(html)

如果我只想测试一个页面,比如'page.html',那这样做是可以的。但是我有成百上千个页面需要测试。如果我每次都复制这个类,然后改一下类名和文件路径,那显然太荒谬了。

我想过在设置部分写代码,为每个页面创建单独的抓取对象,并把它们存储在测试对象的一个列表里。然后我可以让测试方法对每个抓取对象进行操作。但我觉得这样会遇到保持每个测试独立的问题,还会在nose中得到不同的消息。

我也尝试过从一个基础测试类继承,并把路径传给init,但这会给nose带来问题。

如果有人能给我一些建议,告诉我怎么用nose解决这个问题,或者推荐其他的方法,或者一些有用的阅读材料,我会非常感激。

2 个回答

0

使用 Freshen(https://github.com/rlisagor/freshen)配合 nose 似乎是最好的解决办法。

你只需要写一些功能文件,然后每个需要测试的网址只需添加一个场景就可以了。

0

根据你的代码示例,你只需要一个类工厂:

def make_test(page)
    class TestPage(object):
        def setup(self):
            with open(page, 'r') as f:
                html = f.read()
            self.scraper = Scraper(html)
     return TestPage

现在你可以遍历一个页面列表,为每个页面做一个测试:

for page in list_of_pages:
    Test = make_test(page)
    Test().run() 

我不太确定这是否是运行nose测试的方式,但这会是一个完整的类,所以你可以像平常一样使用它。

你可以把所有的测试页面存放在一个文件夹里,这样你就可以循环遍历这个文件夹里的文件,获取你的页面列表。要创建一个新的测试,只需要把html文件保存在指定的文件夹里。这样说是不是符合你的想法?

撰写回答