我有一个非常奇怪的行为,我无法解释.
我有以下课程:
public class Project
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以及返回Project对象的方法:
public Project GetByName(string Name)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Project project = session.CreateCriteria(typeof(Project))
.Add(Restrictions.Eq("Name", Name))
.UniqueResult<Project>();
return project;
}
}
Run Code Online (Sandbox Code Playgroud)
我添加了一个单元测试来测试GetByName方法:
[TestMethod]
public void TestGetByName()
{
IProjectsRepository projectRepository = new ProjectsRepository();
var expected = new Project { Id = 1000, Name = "Project1" };
var actual = projectRepository.GetByName(expected.Name);
Assert.AreEqual<Project>(expected, actual); …Run Code Online (Sandbox Code Playgroud) 最后,我有一个问题要问Stack Overflow!:-)
主要目标是Java,但我认为它主要与语言无关:如果你没有本机断言,你可以随时模拟它.
我在一家销售一套用Java编写的软件的公司工作.代码很旧,至少可以追溯到Java 1.3,在某些地方,它显示......这是一个庞大的代码库,大约有两百万行,所以我们不能一次重构它.
最近,我们将最新版本从Java 1.4语法和JVM切换到Java 1.6,保守地使用了一些新功能,例如assert(我们曾经使用过DEBUG.ASSERT宏 - 我知道assert已经在1.4中引入但我们没有使用过它之前),泛型(只有打字的集合),foreach循环,枚举等.
尽管我已经阅读了几篇关于这个主题的文章,但我对assert的使用仍然有点青睐.然而,我看到的一些用法让我感到困惑,伤害了我的常识... ^ _ ^所以我想我应该问一些问题,看看我是否正确想要纠正的东西,或者它是否违背了常规做法.我很啰嗦,所以我大胆地提出问题,因为那些喜欢撇去东西的人.
作为参考,我在SO中搜索断言java并发现了一些有趣的线程,但显然没有完全重复.
new String[0])但并非总是如此.我们必须忍受这一点,至少是为了维护遗留代码.首先,主要问题,今天引发了我的问题:
SubDocument aSubDoc = documents.GetAt( i );
assert( aSubDoc != null );
if ( aSubDoc.GetType() == GIS_DOC )
{
continue;
}
assert( aSubDoc.GetDoc() != null );
ContentsInfo ci = (ContentsInfo) aSubDoc.GetDoc();
Run Code Online (Sandbox Code Playgroud)
(是的,我们使用MS的C/C++样式/代码约定.我甚至喜欢它(来自相同的背景)!所以起诉我们.)
首先,assert()表单来自DEBUG.ASSERT()调用的转换.我不喜欢额外的括号,因为assert是一个语言结构,而不是(不再是,这里)一个函数调用.我也不喜欢return (foo);:-) …
在ASP.NET中设置适当的调试环境似乎是一个相当大的麻烦,我只是想知道是否使用Asserts是否可行.我读了一下,看到你需要修改你的web.config以正确使用Asserts.这通常是最好的方法还是其他调试方法可能更容易使用?
我们不使用单元测试框架,因此与问题无关.
你怎么知道他们正常工作或根本不工作的区别?目前我可以在我的代码中输入断言,它绝对不会做任何事情,因为它们没有在web.config中配置.这对我来说似乎很危险.
我一直在为一些遗留的C++代码添加单元测试,并且我遇到了很多场景,其中函数内的断言在单元测试运行期间会被触发.我遇到的一个常见习语是带有指针参数的函数,如果参数为NULL则立即断言.
当我进行单元测试时,我可以通过禁用断言轻松解决这个问题.但我开始怀疑单元测试是否应该减轻对运行时断言的需求.这是正确的评估吗?单元测试是否应该通过在管道中更快地发生来替换运行时断言(即:错误是在失败的测试中捕获而不是在程序运行时).
另一方面,我不喜欢添加软代码失败(例如if (param == NULL) return false;).运行时断言至少可以在单元测试错过错误时更容易调试问题.
我有一个关于Python中的错误检查的问题.假设我有一个将文件路径作为输入的函数:
def myFunction(filepath):
infile = open(filepath)
#etc etc...
Run Code Online (Sandbox Code Playgroud)
一个可能的先决条件是文件应该存在.
有几种可能的方法来检查这个前提条件,我只是想知道最好的方法是什么.
i)检查if语句:
if not os.path.exists(filepath):
raise IOException('File does not exist: %s' % filepath)
Run Code Online (Sandbox Code Playgroud)
这是我通常会这样做的方式,尽管如果文件不存在,Python会引发相同的IOException,即使我没有提出它.
ii)使用assert检查前提条件:
assert os.path.exists(filepath), 'File does not exist: %s' % filepath
Run Code Online (Sandbox Code Playgroud)
使用asserts似乎是检查前/后条件的"标准"方式,所以我很想使用它们.但是,在执行期间使用-o标志时,可能会关闭这些断言,这意味着可能会关闭此检查,这似乎有风险.
iii)根本不处理前提条件
这是因为如果filepath不存在,则无论如何都会生成异常,并且异常消息足够详细,以便用户知道该文件不存在
我只是想知道上面哪一项是我应该用于我的代码的标准做法.
我有一个多线程Java程序,其中包含一些围绕线程的规则:例如,A类中的代码只能从UI线程调用; 必须仅从网络线程等调用B类中的3个方法.
关于如何进行断言或其他代码检查的任何建议都遵循这些规则?我想做相当于"不变量"的测试,以防止线程使用上的编码错误.
我在方法参数上使用Findbugs和javax.annotation.Nonnull.
在私有方法上,我通常添加一个断言行来检查null
private void myMethod(@Nonnull String str) {
assert str != null
....
Run Code Online (Sandbox Code Playgroud)
最新的Netbeans版本(7.3rc2)报告断言检查不是必需的(因为Nonnull注释).我不完全确定这是一个Netbeans错误.
可以删除断言行,因为我指定了@Nonnull注释吗?
据我所知,注释仅在静态分析期间使用,而assert在启用时在执行期间处于活动状态,因此两个不是替代.
这个问题很接近,但仍然不是我想要的.我想以通用的方式断言两个bean对象是等价的.如果它们不是,我想要一个详细的错误消息来解释差异而不是布尔"等于"或"不等于".
我们有几个中等大小的C代码库,可以接收来自具有各种经验级别的开发人员的提交.一些不那么有纪律的程序员会assert()使用副作用来声明语句,这会导致断言被禁用.例如
assert(function_that_should_always_be_called());
Run Code Online (Sandbox Code Playgroud)
我们已经使用了自己的assert()实现,但是使用NDEBUGdefine定义表达式会导致不可接受的性能下降.是否有我们可以传递的GCC扩展或标志会触发这些的编译时警告/错误?通过足够简单的控制流程,GCC应该可以确定您只调用纯函数.