数据驱动的测试使用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。对于如何解决这个看似简单的问题,有什么建议吗?

数据驱动的测试使用csv与双重失败

可以(至少在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,155.1解析为同一区域设置中的双精度。对于荷兰语言环境,只接受逗号。

我建议使用。always,因为它匹配不变文化;为了确保双分隔符按预期工作,只需添加

DecimalSymbol=.

在你的schema.ini。(我没有找到一种方法来解释CSV解析器,这是. CSV文件的区域设置;