我在多个脚本中多次使用断言,我想知道是否有人对更好的方法有任何建议,而不是我在下面创建的函数.
def assert_validation(expected, actual, type='', message=''):
if type == '==':
assert expected == actual, 'Expected: %s, Actual: %s, %s' %(expected, actual, message)
elif type == '!=':
assert expected != actual, 'Expected: %s, Actual: %s, %s' %(expected, actual, message)
elif type == '<=':
assert expected <= actual, 'Expected: %s, Actual: %s, %s' %(expected, actual, message)
elif type == '>=':
assert expected >= actual, 'Expected: %s, Actual: %s, %s' %(expected, actual, message)
def assert_str_validation(expected, actual, type='', message=''):
if type == '==':
assert …Run Code Online (Sandbox Code Playgroud) 我希望将实现断言宏作为C++中的方法,如.NET Framewrk.
例如在C#中,我们可以像这样调用assert方法:
Debug.Assert(index > -1);
Run Code Online (Sandbox Code Playgroud)
我希望实现断言这样的东西:
#include <assert.h>
class debug
{
public:
static void my_asset(<condition>) // like assert macro
{
// ?
}
};
Run Code Online (Sandbox Code Playgroud)
使用此课程时:
debug::my_asset(index > -1); // Actually should be called assert(index > -1);
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑:
我想在调用时debug::my_asset(index > -1);,它显示正确的文件名和行号,它的工作方式类似于C++资产宏.
我已经定义了一个自定义断言宏.这适用于所有其他比较.但是,我得到编译器错误:
ISO C++ forbids comparison between pointer and integer
Run Code Online (Sandbox Code Playgroud)
当使用下面显示的宏(DWASSERT)来比较指针时,如下面的代码所示.
#define DWASSERT(condition,printstatement) if(!condition){ printf(printstatement); assert(condition); }
#include <stdio.h>
int main()
{
int target = 0;
int* ptr1 = ⌖
int* ptr2 = ⌖
//Normal comparison works fine
if(ptr1 == ptr2)
printf("Equal");
//Comparison using Macro generates compiler
//error on the next line
DWASSERT(ptr1 == ptr2, "Pointers not equal!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
虽然我可以简单地避免在这种情况下使用DWASSERT,但我很好奇为什么会生成此编译器错误.
我有一个测试用例和一个帮助类.在helper类中,我想在这里使用assert:
MainTests.h
#import <SenTestingKit/SenTestingKit.h>
@interface MainTests : SenTestCase
@end
Run Code Online (Sandbox Code Playgroud)
MainTests.m
#import "MainTests.h"
#import "HelperClass.h"
@implementation MainTests
- (void)testExample {
HelperClass *helperClass = [[HelperClass alloc] init];
[helperClass fail];
}
@end
Run Code Online (Sandbox Code Playgroud)
HelperClass.h
#import <SenTestingKit/SenTestingKit.h>
@interface HelperClass : SenTestCase
- (void)fail;
@end
Run Code Online (Sandbox Code Playgroud)
HelperClass.m
#import "HelperClass.h"
@implementation HelperClass
- (void)fail {
STFail(@"This should fail");
}
@end
Run Code Online (Sandbox Code Playgroud)
旁注:我必须使辅助类成为子类,SenTestCase才能访问断言宏.
来自辅助类的断言被忽略.有什么想法吗?如何在辅助类中使用断言?
我正在研究断言,所以写了下面的代码
public class AssertionDemo
{
static
{
int i=7;
assert i>10:i;
}
public static void main(String args[])
{
int i=8;
assert (i<10):8;
assert (i>10):9;
}
}
Run Code Online (Sandbox Code Playgroud)
在控制台输出之前,我得到以下对话框

OUTPUT:
Exception in thread "main" java.lang.AssertionError: 7
at logicBuliding.AssertionDemo.<clinit>(AssertionDemo.java:8)
Run Code Online (Sandbox Code Playgroud)
对话框怎么了?
我目前正在使用TDD编写测试,我遇到了一些问题.
通常在编写单元测试时,我总是习惯于每单元测试使用1个断言,因为这被定义为良好实践,并且很容易理解为什么测试失败.
在TDD中,做同样的事情也是一种好习惯,如果是这种情况,那么使用TDD有效地设计1个方法我将最终得到超过1个单元测试 - 因为我实际上需要超过1个断言.
另一个问题是我实际上断言了什么?
我可以断言我认为返回对象可能是什么?
所以我必须创建返回类型(可能是复杂的许多属性)并确保这些在断言上匹配,这在技术上可能是1断言.
或者另一种方式是确保我沿途弥补的嘲讽实际上被调用,即我的MOQ我可以做以下
myServiceMock.Verify(x => x.ItemsReceived(), Times.Once());
Run Code Online (Sandbox Code Playgroud)
所以我可以确保在我的模拟上只调用一个方法,这实际上被归类为断言.所以它回到原始查询,每单元测试1断言,所以我需要创建额外的单元测试,以确保调用其他模拟上的其他方法.
其他人在这做什么?
你是断言在mocks上调用方法还是按照你的期望返回值.
真的很期待任何人对此有任何意见.
在javaFx中,我们在每个生成的控制器类的initialize方法中看到以下语句,对于每个使用fxid的控件.
assert type != null : "fx:id=\"type\" was not injected: check your FXML file 'FinancialReport.fxml'.";
Run Code Online (Sandbox Code Playgroud)
我可以理解,该语句是为了确保在加载此fxml时,fx:id的控件存在于fxml布局文件中,如果控件不存在则会抛出异常并退出fxml加载过程.
但随后提到这一点,我了解到不建议在生产代码中使用断言.再次学习本教程,似乎断言很有用,特别是在调试时(但不能用于验证公共方法的参数).
我需要更多以下知识:
这是我认为可能有用但我没有看到在gcc的标准库中实现的东西.
基本上,在我看来,STL实现可以添加断言来检测(在运行时)简单的错误,如越界访问.我猜这些访问在标准中无论如何都是未定义的行为,所以肯定会打印错误消息并且-optionally-aborting将符合标准.
这些断言当然可以在编译时通过旧的NDEBUG标志或其他标志来关闭.
作为一个小例子,我希望此代码中止:
#include <vector>
int main()
{
return std::vector<int>{1,2}[2];
}
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我充分意识到像valgrind这样的工具的存在,但这可能是一个奖励.此外,像valgrind这样的内存检查工具不能保证在向量缩小后检测某些错误,例如访问越界元素,因为实现可能不会立即重新分配底层内存.
例:
Assert.AreEqual(**null**, Program.nDaysMonth(5, -10), "Error nDaysMonth, Month may -10.");
Run Code Online (Sandbox Code Playgroud)
我期待一个例外.我怎么能在Assert.AreEqual中得到异常?
谢谢.
该库使用assert()好像它是发布模式下的标识函数(当定义了NDEBUG时).问题是一些重要的代码被包装assert(),并且在发布模式下执行时我的测试被触发,因为这些重要的部分没有被调用.这里可以找到一个例子,其中随机字节生成器不会生成任何东西,并将导致无限循环.
个人轶事:我不喜欢assert(),我个人不会因为这些歧义问题而使用它.我听说很多项目都有严重错误,因为它,最近的EOS,当他们的单元测试没有检测到一些超出范围的数组时,因为NDEBUG是在发布模式下定义的并且没有触发.在这一点上,文档似乎并不清楚.是否assert()充当身份?
这个库(libbtc)似乎被广泛使用,我不明白为什么开发人员会这样做.这是一个可怕的错误,我应该分叉并删除所有这些断言?或者这是一些与C++不兼容的C事物?有人可以在这里解释一下正确的行动方案吗?
我用clang 6.