突然领悟了,先在 classA 里面加个 init 的属性值,然后在执行 fun2() 的过程中把属性值改变,然后在 fun4() 中去超类继承,然后使用父类的 init 的值就可以了。 不知道是不是都用这个方法呢
你这个方法,fun4() 能拿到的只有 init 里配置的初始值,拿不到 fun2() 里面改变后新的属性值吧。fun2() 改变的是 class A 对象里面的内部属性,而 class B 继承的是类,而非对象。
而且即使能实现,你这块设计也会导致使用时比较混乱。因为你这个属性值有可能在 class A 的任何方法里被改动,而且这个 class A 极有可能是在其它文件里的,对于 class B 的使用人员来说,这个属性值是一个难以预测的值,要合理使用还得看完 class A
建议可以考虑下,修改 class A ,提供这个属性值的 get 方法。然后 class B 通过获取 class A 实例化后的对象,来获取对象里面的属性(可以通过单例模式来保障 class A 只会有一个对象,避免存在多个对象拿错了)。而不是通过继承去获取。继承只能继承类,复用里面类相关的资料(如方法、类变量这类代码里本身就有写好的内容),但没法继承一个对象的(也就是用不了任何运行时才创建或改变的内容)。
或者可以去掉这些 class A 之类的脱敏,具体说下你这个场景是什么,这样才能更好地给合适的建议。
你这个 var 是中间变量值,要传递出去无非就是调用 fun4 的时候当作参数传进去。或者在类 A 里面加个类变量存这个 var,然后 fun4 里面拿去用。
你这个描述让人疑惑的地方是,又说 fun2 是框架源码你改不了,另一边你第一条回复又说类 A 你能改,到底哪里能改哪里不能改你自己都说不清楚。。
周五的时候试了下可以拿到相关的值,我修改的是 unittest.TestCase 类里面的 run 方法。我在想应该还是要再写个 get 函数去专门获取对应的值,但是这个 get 的函数需要一个传参,传参的值还是在 classA 里面获取到的,在 ClassB 里面仍绕不开去拿这个传参的值,还是需要在 ClassA 里面加属性值。
var 中间变量是源码给我的,也就是我上面回复贴图里面的 outcome.success,我的意思可能没表述清楚,我是指这个地方不能把当前的 outcome.success 值给 return 出来,因为这样后面源码就不会执行了。目前的话是把 outcome.success 的值用 init 里面的属性值保存,不清楚大家都是用什么方法去保存变量,然后调用的
额,从你的截图看,你这个代码里,self.staue 没可能是 False 。你这里逻辑是不是没贴全?
1、初始值是 True
2、后续改变值的语句 self.statue = outcome.success
,是放在了 if outcome.success
里面的,意味着这里面的 outcome.success
值如果是布尔值,那也必定是 True
所以,你在后面继承的 B 类里拿到 self.statue 是 True ,说明不了这个 True 就是第二个位置给的。
然后,也没太看懂你这里加个 self.statue 且想要被子类拿到的目的是什么,想实现什么功能?这块可以说下不?
PS:statue 是不是拼错了?状态的英文应该是 status
上面的 if outcome.success 这块一定是为 True 的,因为源码定义是为 True,会走进来
所以在这边变为 False 的情况下去把类的属性值进行更改,后续有个调用 TearDown 的函数,在用例执行结束之前我们需要写 db,如果用例执行失败/错误了那就不写 db 了,所以获取 outcome.success 是为了判断用例是否执行成功。
这块逻辑我试验了没有问题,只是不确定大家是不是都这样拿数据,还是有更好的办法
英文确实拼错了 尴尬
需求不难,但是提的问题把旁观的人都绕进去了,
class MyTest(unittest.TestCase):
def tearDown(self):
if hasattr(self, '_outcome'): # Python 3.4+
result = self.defaultTestResult() # These two methods have no side effects
self._feedErrorsToResult(result, self._outcome.errors)
else: # Python 3.2 - 3.3 or 3.0 - 3.1 and 2.7
result = getattr(self, '_outcomeForDoCleanups', self._resultForDoCleanups)
error = self.list2reason(result.errors)
failure = self.list2reason(result.failures)
ok = not error and not failure
# Demo: report short info immediately (not important)
if not ok:
typ, text = ('ERROR', error) if error else ('FAIL', failure)
msg = [x for x in text.split('\n')[1:] if not x.startswith(' ')][0]
print("\n%s: %s\n %s" % (typ, self.id(), msg))
def list2reason(self, exc_list):
if exc_list and exc_list[-1][0] is self:
return exc_list[-1][1]
参考https://stackoverflow.com/questions/4414234/getting-pythons-unittest-results-in-a-teardown-method
或者学习 pytest 的@pytest.mark.hookwrapper