数据驱动的测试使用csv与双重失败
本文关键字:失败 csv 测试 数据驱动 | 更新日期: 2023-09-27 17:53:08
我是滴滴涕的新手,我创建了一个非常小的整数和双精度值测试。我可以毫无问题地解析整数,但我不能使用双精度浮点数。
下面是我的c#代码:
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "bounds.csv", "bounds#csv",
DataAccessMethod.Sequential)]
[DeploymentItem("bounds.csv")]
[DeploymentItem("schema.ini")]
[TestMethod]
public void GetBestUsingBounds()
{
// https://msdn.microsoft.com/en-us/library/ee624082.aspx
var x1 = Convert.ToDouble(TestContext.DataRow["x1"]);
var x2 = Convert.ToDouble(TestContext.DataRow["x2"]);
}
我的csv文件:
x1;y1
11,1;55.1
-6;50
和my scheme.ini:
[bounds.csv]
Format=Delimited(;)
第二行被正确读取,它们只是整数,但是第一行要么去掉小数点11.1变成11,要么去掉小数点11.1变成111。
当我添加引号(双引号或单引号)时,整行将被跳过。
如果我使用schema.ini with;作为分隔符或不带scheme.ini的默认分隔符。
问题不在于Convert。ToDouble 和TestContext。DataRow["x1"]已经错了。
我在荷兰Win8.1上使用VS2013 Pro。对于如何解决这个看似简单的问题,有什么建议吗?
可以(至少在VS2015中)引用值,如下所示:
x1;y1
"11.1";"55.1"
-6;50
它将被视为字符串字面值,并且可以像这样转换为double:
Convert.ToDouble(TestContext.DataRow["x1"], CultureInfo.InvariantCulture);
这是一个与全球化相关的错误。您得到的答案取决于您的语言环境。
例如:
NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
Number number = format.parse("1,234");
double d = number.doubleValue();
这似乎是MsTest中的一个bug(正如Margus指出的)。以下是我在相同情况下使用的解决方案:
将csv文件更改为
x1;y1
a11.1;a55.1
a-6;a50
和你的c#代码到
var x1 = Convert.ToDouble(TestContext.DataRow["x1"]ToString().TrimStart('a'));
var x2 = Convert.ToDouble(TestContext.DataRow["x2"]ToString().TrimStart('a'));
当然其他字母也可以。使用字母前缀,您可以避免MsTest自动将csv数据转换为double,从而使其没有机会做错。
我知道这很丑,但似乎没有人有更好的答案…
问题是您不能将11,1
和55.1
解析为同一区域设置中的双精度。对于荷兰语言环境,只接受逗号。
我建议使用。always,因为它匹配不变文化;为了确保双分隔符按预期工作,只需添加
DecimalSymbol=.
在你的schema.ini
。(我没有找到一种方法来解释CSV解析器,这是. CSV文件的区域设置;