написать тест для кода Scala - PullRequest
0 голосов
/ 25 апреля 2018

Я учусь делать юнит-тесты с Scatatest, но у меня есть несколько основных вопросов, так как я изучаю Scala / Scalatest Я написал один скрипт Scala, который имеет один объект Scala с несколькими методами. Мой вопрос заключается в следующем: я должен написать один модульный тест для всего объекта Scala или я должен написать тест для каждой функции. Например, я написал следующую функцию: Знаете ли вы, как написать тест с помощью теста scala для этой конкретной функции:

def dataProcessing (input: List[String]) = {



val Data = input.map(_.trim).filter(x => !(x contains "$")).filter(line => Seq("11", "18").exists(s => line.contains(s))).map(elt => elt.replaceAll("""[\t\p{Zs}\.\$]+""", " ")).map(_.split("\\s+")).map(x => (x(1),x(1),x(3),dataLength(x(3)),dataType(x(3))))

 return Data
}

Наконец, я пытаюсь использовать лучшие методики проектирования, основанного на тестировании, но все еще не знаю, как приступить к написанию тестов перед написанием кода. Любые советы, как действовать в соответствии с этими практиками.

Большое спасибо

1 Ответ

0 голосов
/ 04 мая 2018

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

Существует множество стилей тестирования, поддерживаемых scala test.Лично мне нравится WordSpec.Выполняемый базовый тест будет выглядеть следующим образом:

class MyTest extends WordSpec with Matchers {
  "My Object" should {
    "process descriptors" when {
      "there is one input" in {
        val input = List("2010 Ford Mustang")

        val output = MyObject.descriptorProcessing(input)

        output should have length 1
        output.head shouldBe()
      }

      "there are two inputs" in pendingUntilFixed {
        val input = List("Abraham Joe Lincoln, 34, President",
                         "George Ronald Washington, 29, President")

        val output = MyObject.descriptorProcessing(input)

        output should have length 2
        output.head shouldBe()
      }
    }

    "format descriptors" when {
      "there is one input" in pending
    }
  }
}

Я использовал две функции скалярного разрешения, включающие TDD: pendingUntilFixed и pending.

pendingUntilFixed позволяетнаписать тест для кода, который еще не был реализован или еще не работает правильно.Пока утверждение в тесте не выполняется, тест игнорируется и отображается желтым цветом.Как только все утверждения пройдены, тест не пройден, и вы узнаете, что можете его включить.Это включает TDD, в то же время позволяя вашей сборке пройти до того, как работа будет завершена.

pending - это маркер, говорящий: «Я собираюсь написать тест для этого, но я еще не получил его»,Я часто этим пользуюсь, так как это позволяет мне написать план моих тестов, а затем вернуться и заполнить их.

...