使用csv with double的Datadriven测试失败

时间:2015-06-04 08:36:23

标签: c# unit-testing csv data-driven-tests

我是DDT的新手,我用整数和双值创建了一个非常小的测试。 我可以毫无问题地解析整数但我无法使用双精度。

这是我的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

我的scheme.ini:

[bounds.csv]
Format=Delimited(;)

第二行是正确读取的,它们只是整数,但第一行要么被删除小数:11.1变为11或从小数点剥离11.1变为111.

当我添加引号(双引号或单引号)时,将跳过整行。

如果我使用schema.ini并不重要; as delimiter或没有scheme.ini,默认为分隔符。

问题不在于 Convert.ToDouble TestContext.DataRow [" x1"] 已经错误。

我在荷兰的Win8.1上使用VS2013 Pro。关于如何解决这个看似简单的问题的任何建议?

4 个答案:

答案 0 :(得分:1)

可以(至少在VS2015中)引用该值,如下所示:

x1;y1
"11.1";"55.1"
-6;50

然后它将被视为字符串文字,并且可以像这样转换为double:

Convert.ToDouble(TestContext.DataRow["x1"], CultureInfo.InvariantCulture);

答案 1 :(得分:0)

这是一个与全球化有关的错误。你得到的答案取决于你的地区。

例如:

NumberFormat format = NumberFormat.getInstance(Locale.FRANCE);
Number number = format.parse("1,234");
double d = number.doubleValue();

答案 2 :(得分:0)

这似乎是MsTest中的一个错误(正如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数据自动转换为双倍,从而使其无法正确执行此操作。

我知道这很难看,但似乎没有人有更好的答案......

答案 3 :(得分:0)

问题是您无法将11,155.1解析为同一语言环境中的双精度数。对于荷兰语语言环境,只接受逗号。

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

DecimalSymbol=.

schema.ini中。 (我没有找到解释CSV解析器的方法,这是.csv文件的语言环境;它似乎是一个错误。)