我真的希望能够:(在C++中)
assert( num > 0, "The number must be greater than zero!");
Run Code Online (Sandbox Code Playgroud)
在C#XNA中,他们有一个方法可以完成这个:
Debug.Assert( num > 0, "The number must be greater than zero!");
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,以便运行时给我一个意义完整的错误,而不仅仅是"断言失败"错误?
单元测试应该在调试模式还是发布模式下运行?
我使用的是Visual Studio Standard Edition 2005,它没有任何单元测试框架.由于我也不想使用任何其他第三方单元测试框架,我曾经Debug.Assert在所有单元测试方法中执行实际测试.但是,Debug.Assert仅适用于调试模式.
是否有等效的发布模式或是否有其他替代方案(不使用第三方工具)?
我有这段代码
import java.util.ArrayList;
import java.util.List;
public class AssertTest {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
assert(list.add("test")); //<-- adds an element
System.out.println(list.size());
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
Run Code Online (Sandbox Code Playgroud)
为什么输出列表为空?断言如何表现在这里?先感谢您!
嗯,我有一个货币对象,允许我添加其他货币对象.我尝试assertEquals()在java中测试我的代码是否正常,但后来失败了.
我非常肯定我的代码是正确的(System.out.println返回正确的答案),我想我只是assertEquals以错误的方式使用.T_T
如果我想知道是否myObj1 == myObj2进行测试,我究竟能使用什么?
**in my test.java**
assertEquals(new Money(money1.getCurrency(),new Value(22,70)),money1.add(money2));
**in my money class**
public class Money {
Currency currency;
Value value;
//constructor for Money class
public Money(Currency currency, Value value) {
super();
this.currency = currency;
this.value = value;
}
public Currency getCurrency() {
return currency;
}
public void setCurrency(Currency currency) {
this.currency = currency;
}
//must have same currency
public Money add(Money moneyToBeAdded){
Money result = new Money(moneyToBeAdded.currency, new Value(0,0)); …Run Code Online (Sandbox Code Playgroud) 对于检索实时股票价格的应用程序,我发现我的单元测试断言由于两个调用之间的价格波动而返回假阴性,这些调用填充了包含expected和actual测试值的变量.
虽然这是可以预期的,但我希望听到有关如何解决这个问题的不同方法.我最初的想法是允许波动幅度(检索到的股票价格之间差异约为2%)
这是向Yahoo发出Web请求以检索股票价格的代码.
public string makeWebRequest(string stockSymbol, string dataRequestID)
{
string request = webClient.DownloadString("http://finance.yahoo.com/d/quotes.csv?s=" + stockSymbol +
"&f=" + dataRequestID).Replace("\r\n", "").Replace("\"", "");
if (request.Equals("N/A") || request.Equals("0"))
return "0.00";
return request;
}
public string getPrice(string stockSymbol)
{
return makeWebRequest(stockSymbol, "l1");
}
Run Code Online (Sandbox Code Playgroud)
这是单元测试,它对股票价格进行"硬编码"(已知是成功的)Web请求并将结果分配给expected变量.然后,执行另一个调用,以便仅使用应用程序object.function检索价格,然后将其分配给actual变量.
呼叫之间的增量为300毫秒
[TestMethod]
public void getPrice()
{
string expected = request.DownloadString("http://finance.yahoo.com/d/quotes.csv?s=" + testSymbol + "&f=l1").Replace("\r\n", "").Replace("\"", "");
string actual = yahoo.getPrice(testSymbol);
Assert.AreEqual(expected, actual);
}
Run Code Online (Sandbox Code Playgroud)
有什么建议?或者我应该学会忍受它?
是否有可能在断言错误上写一条消息?
例如,使用#include <assert.h>,我只能写:
void foo(int a, int b) {
assert (a != b);
}
Run Code Online (Sandbox Code Playgroud)
然而,在一个错误我想看到的价值a和b.我怎样才能做到这一点?
任何人都可以帮助我理解,因为预期值和实际值在ToString()方法中有不同的结果.当我为我打开手表时它是相同的值.
谢谢
码:
[TestMethod]
public void SerializeDecimalWithTwoDecimals()
{
var expected = decimal.Round(1.00M,2);
var actual = decimal.Round(1M,2);
Assert.AreEqual(expected.ToString(), actual.ToString());
}
Run Code Online (Sandbox Code Playgroud) 在第一次和第二次通话时抛出的方法:
public void foo() throws Exception
Run Code Online (Sandbox Code Playgroud)
测试:
@test
public void testFooThrowsAtFirstAndSecondTime(){
boolean thrown;
try {
foo();
} catch (Exception e) {
thrown = true;
}
assertTrue(thrown);
thrown = false;
try {
foo();
} catch (Exception e) {
thrown = true;
}
assertTrue(thrown);
foo();
}
Run Code Online (Sandbox Code Playgroud)
你能帮我找到更好的解决方案吗?使用Mockito获得更好的解决方案也是可以接受的.
我的意思是更好,如果我可以在我的测试中避免尝试/捕获甚至多次尝试/捕获.在其他语言或jAssert我认为即使在春天也有如下陈述:
assertThrows(method(..)) //PseudoCode
Run Code Online (Sandbox Code Playgroud)
我认为与Mockito或JUnit 4.x有类似的事情.
我知道
@Test(expected=Exception)
Run Code Online (Sandbox Code Playgroud)
但是,如果我期待一次投掷并且测试结束之后,这将是可接受的.
我在Python 2.7中遇到列表别名或变量赋值的问题.我将向您展示一个最小的例子.有和没有断言有两种不同的结果,我不知道断言为什么/如何影响这一点.
不知何故,当我向object_list下面显示的内容添加时,它会覆盖一个属性:
class Object1(object):
def __init__(self):
self.object_list = []
def add_thing(self, thing):
# this next line makes all the difference
assert thing.name not in [thing.name for thing in self.object_list], 'agent id already exists, use another one'
self.object_list.append(thing)
class Thing(object):
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
这是一个最小的例子:
随着断言
mfd = Object1()
myAgent = Thing('blah')
myAgent_2 = Thing('blew')
mfd.add_thing(myAgent)
mfd.add_thing(myAgent_2)
print mfd.object_list
>> [blah, blah]
Run Code Online (Sandbox Code Playgroud)
没有断言
mfd = Object1()
myAgent = …Run Code Online (Sandbox Code Playgroud) 如果a class被定义为
public class MyClass {
private long id;
private MyEnum myEnum;
// getter and setters
}
Run Code Online (Sandbox Code Playgroud)
并MyEnumClass定义为
public enum MyEnum {
VALUE_A, VALUE_B, VALUE_C;
}
Run Code Online (Sandbox Code Playgroud)
测试如何确保a List<MyClass>不包含MyClasswhere的任何实例MyClass。enum例如,是VALUE_C?