编辑:切换到一个更好的例子,并澄清为什么这是一个真正的问题.
我想在Python中编写单元测试,在断言失败时继续执行,这样我就可以在单个测试中看到多个失败.例如:
class Car(object):
def __init__(self, make, model):
self.make = make
self.model = make # Copy and paste error: should be model.
self.has_seats = True
self.wheel_count = 3 # Typo: should be 4.
class CarTest(unittest.TestCase):
def test_init(self):
make = "Ford"
model = "Model T"
car = Car(make=make, model=model)
self.assertEqual(car.make, make)
self.assertEqual(car.model, model) # Failure!
self.assertTrue(car.has_seats)
self.assertEqual(car.wheel_count, 4) # Failure!
Run Code Online (Sandbox Code Playgroud)
在这里,测试的目的是确保Car __init__正确设置其字段.我可以将它分解为四种方法(这通常是一个好主意),但在这种情况下,我认为将它作为测试单个概念的单个方法("对象被正确初始化")更具可读性.
如果我们假设这里最好不分解方法,那么我有一个新问题:我无法立即看到所有错误.当我修复model错误并重新运行测试时,会wheel_count出现错误.当我第一次运行测试时,它可以节省我看到两个错误的时间.
为了比较,Google的C++单元测试框架区分了非致命EXPECT_*断言和致命ASSERT_*断言:
断言成对出现,测试相同的东西但对当前函数有不同的影响.ASSERT_*版本在失败时会生成致命的故障,并中止当前的功能.EXPECT_*版本生成非致命故障,不会中止当前功能.通常EXPECT_*是首选,因为它们允许在测试中报告多个失败.但是,如果在有问题的断言失败时继续没有意义,则应使用ASSERT_*.
有没有办法EXPECT_*在Python中获得类似行为unittest?如果没有 …
Linux的stddef.h定义offsetof()为:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
Run Code Online (Sandbox Code Playgroud)
而维基百科上的文章offsetof()(http://en.wikipedia.org/wiki/Offsetof)将其定义为:
#define offsetof(st, m) \
((size_t) ( (char *)&((st *)(0))->m - (char *)0 ))
Run Code Online (Sandbox Code Playgroud)
为什么减去(char *)0维基百科版本?有什么情况会真正有所作为吗?
根据"为什么在offsetof()中减去空指针的响应?" (以及我对K&R的解读),C标准并不要求这样做(size_t)((char *)0) == 0.尽管如此,我还没有看到过将一个指向整数类型的空指针计算为其他任何东西的情况.
如果有编译器或场景(size_t)((char *)0) != 0,那是什么?
c compiler-construction pointers casting standards-compliance