任何人都可以解释(或建议一个网站或论文)触发器,断言和检查之间的确切区别,还描述我应该在哪里使用它们吗?
编辑:我的意思是在数据库中,而不是在任何其他系统或编程语言.
我曾经在一家公司工作,其中一些主要架构师/开发人员已经强制要求断言不使用的各种项目,并且他们通常会从代码中删除并替换为异常.
我觉得他们在编写正确的代码时非常重要.任何人都可以建议如何证明这样的授权是合理的吗?如果是这样,断言有什么问题?
我有一个名为unittest的文件:test.py
我的代码:
import unittest
class Test(unittest.TestCase):
def myTest(self):
a = 1
self.assertEqual(a, 1)
if __name__ == '__main__':
unittest.main()
Run Code Online (Sandbox Code Playgroud)
当我按F5时,我收到一个错误:
Traceback (most recent call last):
File "/home/mariusz/Pulpit/test.py", line 1, in <module>
import unittest
File "/home/mariusz/Pulpit/unittest.py", line 3, in <module>
AttributeError: 'module' object has no attribute 'TestCase'
Run Code Online (Sandbox Code Playgroud) 这不是一个"问题"所以我正在制作CW.
该
assert
Run Code Online (Sandbox Code Playgroud)
关键字很棒!
它应该让你觉得你的自己对你编写的代码更有信心,但是,直到今天,当我创建一个小型测试类(<20行)时,我意识到自从它被引入以来从未使用它.
哎呀!我几乎没有使用记录器,这确实非常有用,但直到今天我才意识到我不使用断言.
你使用断言吗?如果不是,那是什么原因?
令人惊讶的我才能够找到SO关于这个主题的一个先前的问题,我只是想获得社会"信任投票"(或不!)我的做法.
我这样看是这样的:
Debug.Assert你的处置将是真实的状态的事情.当我们完全控制我们的环境时,例如在验证某些前后条件的方法中,将使用此方法.在以下场景中它有点模糊.请注意,这是一个仅供参考的示例!
假设我们有MyClass类,它有一个公共属性MyMode和一个方法GetSomeValueForCurrentMode().将MyClass视为一个打算在库中发布(发布版本)以供其他开发人员使用的版本.
我们希望MyMode可以由此类的外部用户更新.现在,GetSomeValueForCurrentMode()有以下逻辑:
switch(MyMode)
{
case Mode.ModeA:
return val1;
case Mode.ModeB:
return val2;
default:
//Uh-uh this should never happen
}
Run Code Online (Sandbox Code Playgroud)
我在这里得到的是MyClass的用户将其置于无效状态.那我们该怎么办?
在默认情况下,我们应该Debug.Assert或throw new InvalidOperationException(或其他)?
有一句咒语说我们不应该信任我们班级的用户.如果我们选择Debug.Assert并将MyClass构建为发布版本(从而删除Debug Asserts),则该类的用户将无法获得他们将其置于无效状态的有用信息.但这与其他咒语相反,后者只表示在完全无法控制的事情发生时抛出异常.
我发现我围绕着这个问题 - 其中一个编程辩论似乎没有明确的'正确'答案.那么让我们投票吧!
编辑:我在相关的SO问题(使用断言或例外的合同设计?)中注意到了这个响应:
经验法则是,在尝试捕获自己的错误时应使用断言,在尝试捕获其他人的错误时应使用异常.换句话说,您应该使用异常来检查公共API函数的前提条件,以及何时获得系统外部的任何数据.您应该将断言用于系统内部的函数或数据.
对我而言,这是有道理的,并且可以与下面概述的'Assert then throw'技术结合使用.
欢迎思考!
假设我们通过使用预期结果对象的属性断言结果对象的所有属性的相等性来测试方法的结果.我们应该实现equals方法并使用Assert.AreEqual(expectedResult,actualResult)......但是equals可能意味着生产代码中存在不同的东西.
哪种是最佳做法?
要么
我想做点什么
java -enableassertions com.geeksanonymous.TestClass
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我正在读一本断言的书(双关语)"你应该Debug.Assert在任何条件总是真或假的情况下用方法加载你的代码."
我没有使用过这两种调试方法,但它有一定道理.但是,我不愿意在我的生产代码库中散布这些东西.
思考?
我想声明一个变量是phpunit中的一个(非空白)字符串,但我不想断言字符串必须匹配任何完全字符串.
例如,我想拉一个用户名,并确保我成功获得了一些非空白用户名,但我并不确切知道我的用户名.
我可以很容易断言它是一个非空变量,或者它是一个完全匹配某个字符串的字符串,或断言var是没有phpunit帮助的字符串:
$this->assertNotEmpty($username);
$this->assertSame('myusername', $username);
$this->assertTrue(is_string($username));
Run Code Online (Sandbox Code Playgroud)
这些都接近我所需要的,使用is_string实际上测试正确的条件,但是自己做is_string还不够好,因为当测试失败时我不能再得到有用的,信息丰富的消息了,而不是告诉我实际返回了什么类型的值,错误消息变得无用:
Failed asserting that false is true.
Run Code Online (Sandbox Code Playgroud)
那么如何使用phpunit的断言系统断言var是string类型和非空白?
有一些程序在MacOSX Mountain Lion下运行,现在(自安装10.8.2以来)导致设置不需要的电源管理断言.我正在寻找一种方法来清除这些断言.
这是一个例子:这些程序中的一个或多个导致以下电源管理断言设置在"powerd"内.请注意下面的"powerd"行...
% pmset -g assertions
10/7/12 11:51:47 AM EDT
Assertion status system-wide:
PreventUserIdleDisplaySleep 1
CPUBoundAssertion 0
PreventSystemSleep 0
PreventUserIdleSystemSleep 0
ExternalMedia 0
UserIsActive 0
ApplePushServiceTask 0
BackgroundTask 0
Listed by owning process:
pid 18(powerd): [0x00000005000001d7] 11:24:18 PreventUserIdleDisplaySleep named: "com.apple.powermanagement.delayDisplayOff"
... etc. ...
Run Code Online (Sandbox Code Playgroud)
这些程序退出并将这种电源管理断言留在"powerd"中,并且它永远保持活跃状态.这可以防止"显示睡眠"和屏幕保护程序被调用.
在这种情况下我知道的唯一选项(除了重新启动)是在"powerd"进程上执行"kill -HUP".这会导致守护程序退出并重新启动而不会出现错误的断言.
有没有人知道10.8.2下的方法让我在"powerd"中清除"PreventUserIdleDisplaySleep"断言,而不强制重启该守护进程?如果需要,我很高兴通过Cocoa,Carbon或AppleScript程序来完成这项工作.
我知道IOPMLib,但该库中的例程似乎只能清除在同一进程中创建的幂断言.我需要一种方法来告诉外部和已经运行的"powerd"进程清除它管理的"PreventUserIdleDisplaySleep"断言.有没有人知道在运行的"powerd"实例中外部设置和清除电源管理断言的API?也许是通过某种通知...... ???