Используйте имя столбца (из файла CSV) в качестве имени теста с использованием Nunit.

Я пытаюсь использовать значение столбца в качестве имени тестов, чтобы все строки отображались на панели обозревателя тестов в Visual Studio отдельно для каждой строки.

Вот какой будет мой тест, потребляющий данные из файла CSV. Я попытался использовать атрибут «TestName» и нарезать («{15:16}») имя по умолчанию для раздела строки, которое я хотел бы использовать в качестве имени теста. Теперь я определенно делаю это правильно, потому что он просто дает мне имя имени метода.

Второй метод — моя операция чтения. Кроме того, мне не нравится присваивать свои данные переменным, а затем передавать их. Я действительно ищу более элегантный способ решить проблему чтения и использования данных CSV для именования и тестирования, поэтому, если у кого-то есть какой-либо опыт или мысли, я был бы рад их услышать.

Пожалуйста, дайте мне знать, если я ушел любую информацию, которая еще больше прояснит мою цель.

class MegaTests
{
    [TestCase(TestName = "{15:16}")]
    [Test, TestCaseSource("GetTestData")]
    public void MyExample_Test(string TestName, string json, string ExpectedResult, string Environment, string ChannelMessage, string ChannelSubject, string MessageCenterMessage, string MessageCenterSubject)
    {
        Console.WriteLine(TestName + " " + json + " " + ExpectedResult + " " + Environment + " " + ChannelMessage + " " + ChannelSubject + " " + MessageCenterMessage + " " + MessageCenterSubject);

    }

private static IEnumerable<string[]> GetTestData()
    {
        //using (var csv = new CsvReader(new StreamReader(@"../../csv/data.csv"), true))
        using (var csv = new CsvReader(new StreamReader(@"DataDriveFromCSV/csv/data.csv"), true))
        {
            while (csv.ReadNextRecord())
            {
                string TestName = csv[0];
                string json = csv[1];
                string ExpectedResult = csv[2];
                string Environment = csv[3];
                string ChannelMessage = csv[4];
                string ChannelSubject = csv[5];
                string MessageCenterMessage = csv[6];
                string MessageCenterSubject = csv[7];

                yield return new[] { TestName, json, ExpectedResult, Environment, ChannelMessage, ChannelSubject, MessageCenterMessage, MessageCenterSubject };
            }
        }
    }

person Adam Lemisch    schedule 09.03.2018    source источник
comment
Может быть, это поможет? Он может разбирать CSV на объекты в зависимости от заголовков, считанных из первой строки файла.   -  person Nyerguds    schedule 09.03.2018
comment
@Nyerguds - спасибо за ответ и предложение. Я должен буду изучить это!   -  person Adam Lemisch    schedule 09.03.2018


Ответы (2)


[TestCase] и [TestCaseSource] — это альтернативные, ортогональные подходы к получению данных для ваших тестов. Они никак не взаимодействуют, хотя вы можете использовать их для получения данных двумя разными способами.

Если вы используете [TestCase(TestName="{15:16}")], вы создаете тест без аргументов и с именем "{15:16}". Использование TestCaseSource — правильный способ сделать то, что вы хотите.

Если вы все обдумаете, то поймете, что не можете передать имя теста в качестве аргумента тесту. Тест должен существовать, чтобы вызвать его в первую очередь, и как только он существует, у него уже есть имя.

Вместо того, чтобы возвращать массив аргументов, вы должны вернуть экземпляр TestCaseData, который позволит вам передавать аргументы, а также установить имя теста.

person Charlie    schedule 09.03.2018

Для всех, у кого есть проблемы с этим...

        {
        using (var csv = new CsvReader(new StreamReader("PATH TO YOUR CSV FILE"), false))

        {
            List<string> Lines = new List<string>();

            int counter = 0;
            while (csv.ReadNextRecord())
            {
                if (counter == 0)
                {
                    for (int i = 0; i < csv.FieldCount; i++)
                    {
                        Lines.Add(csv[i]);
                    }
                }
                else
                {
                    Dictionary<string, string> testData = new Dictionary<string, string>();

                    for (int i = 0; i < Lines.Count; i++)
                    {
                        testData.Add(Lines[i], csv[i]);
                    }
                    yield return new TestCaseData(testData).SetName(csv[0].ToString());
                }
                counter++;
            }
        }
    }
person Adam Lemisch    schedule 24.03.2018