测试管理 当 testcase 使用 ddt 前缀时,testsuite 无法添加该用例?

醋精测试媛 · 2020年12月01日 · 最后由 醋精测试媛 回复于 2020年12月02日 · 3363 次阅读

https://testerhome.com/topics/18111

如上个问题所示,请教大家如何才能一个一个添加用例呢?

suit = unittest.TestSuite()
suit.addTest(TestEnv('test_load_page'))
runner = unittest.TextTestRunner(verbosity=2)
runner.run(suit)

一般这样是没问题的,加上 ddt 就提示找不到 test_load_page 了

报错如下:

AttributeError: type object 'TestEnv' has no attribute 'test_load_page'

但是有时候需要执行某些用例,不执行其他用例,这样的情况应该怎么办呢?

附言 1  ·  2020年12月02日

已解决。

ddt 源码中有个函数用来生成用例名称—— mk_test_name

它接收两个参数:name 和 value。

name:为测试用例的名字。即 test_load_page;
value:为测试数据,ddt 是处理一组测试数据。而这个 value 就是这一组数据中的每一个测试数据。

对 value 的值是有限制的:要么就是单值变量,要么就是元组或者列表并且要求元组和列表中的数据都是单值变量。如 ("name","port") 、["name","port"]

如果传进来的测试数据,不符合 value 的要求,那么测试用例名字为:name_index。
如果传进来的测试数据,符合 value 的要求,那么测试用例名字为:name_index_value。如果 value 为列表或者元组,那么将列表/元组的每个数据依次追加在末尾。

比如传进来的 name 值为 test_login,value 值为 ["name","port"]。那最终的测试用例名字是:test_load_page_01_name_port。

如果传进来的 name 值为 test_login,value 值为{"userName":"18500384561", "password":"123456"},那最终的测试用例名字为:test_load_page_1。 因为它不支持对字典类型的数据处理 。

所以我得到的测试用例名称就是:test_load_page_1test_load_page_2,test_load_page_3

共收到 11 条回复 时间 点赞

不管是 unittest.TestSuite() 方法添加单个用例还是 loader.loadTestsFromNames() 添加用例都不行,都是找不到用例类下面的那个用例,ddt 的限制?

已解决。

ddt 源码中有个函数用来生成用例名称—— mk_test_name

它接收两个参数:name 和 value。

name:为测试用例的名字。即 test_load_page;
value:为测试数据,ddt 是处理一组测试数据。而这个 value 就是这一组数据中的每一个测试数据。

对 value 的值是有限制的:要么就是单值变量,要么就是元组或者列表并且要求元组和列表中的数据都是单值变量。如 ("name","port") 、["name","port"]

如果传进来的测试数据,不符合 value 的要求,那么测试用例名字为:name_index。
如果传进来的测试数据,符合 value 的要求,那么测试用例名字为:name_index_value。如果 value 为列表或者元组,那么将列表/元组的每个数据依次追加在末尾。

比如传进来的 name 值为 test_login,value 值为 ["name","port"]。那最终的测试用例名字是:test_load_page_01_name_port

如果传进来的 name 值为 test_login,value 值为{"userName":"18500384561", "password":"123456"},那最终的测试用例名字为:test_load_page_1。 因为它不支持对字典类型的数据处理 。

所以我得到的测试用例名称就是:test_load_page_1test_load_page_2,test_load_page_3

我记得用例得代码必须 test 开头,是这个问题吗?

自娱自乐 回复

不是,我使用了 test 开头,无论是文件,类,还是方法,可以看看上面的回复,我刚刚解决啦

醋精测试媛 关闭了讨论 12月02日 09:49
醋精测试媛 重新开启了讨论 12月02日 09:49
7楼 已删除
8楼 已删除
仅楼主可见
自娱自乐 回复
element.click()
# 强制等待
sleep(1)

等待一个元素的出现或者一个元素某个属性呈现某种状态,可以去看看隐式等待/显式等待/expected_conditions
但是停顿某个时间,sleep(1) 虽然很多人都说它不够灵活,但是有时候是不得不选择的一个方式,因为有时候页面有加载 java script 的过程,所以就算元素出现了,对其操作会无效。

不是单独对某个元素,而是全部元素。 包括以后迭代的操作

自娱自乐 回复

sleep(1) 就是对所有元素。

你的意思是我对每个操作后面都写一个 sleep(1) ? 能不能优化?

没问题了,我重新优化下点击的方法就行了

自娱自乐 回复

可以,你二次封装 selenium 的每个方法,比如 click

 def click(location , timeout, poll_frequenty):
   self.wait_element(self, timeout, poll_frequenty)
    el = self.find_element(*location)# 已经被封装
    el.click()

def wait_element(location, timeout, poll_frequenty):
"""被封装的的等待元素出现的方法"""
   WebDriverWait(self.driver, timeout).until(expected_conditions.locaton……)

在每个需要获取元素的方法前面加一个 wait,然后封装起来,接下来你使用这些方法就很少需要等待了,但是页面的切换,窗口的出现,你还是需要 sleep(1),有时候它是没法替代的,不过你用的机会会少很多。

可以看看 (https://selenium-python-zh.readthedocs.io/en/latest/waits.html)

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册