의사 코드에서 테스트까지

3522 단어 rubytestingtddrails
테스트 주도 개발. 모든 사람이 알고 있고, 다음은...확실히 전부는 아닙니다. 나는 그것을 인정할 것이다, 나는 새로운 개발자로서 그것을 따르지 않은 죄를 지었지만 처음부터 나쁜 습관에 빠지지 않도록 노력하면서 테스트에 대해 더 성실해지기로 약속했습니다. 이 작업을 수행하면서 시간이 많이 소요될 필요가 없으며 처음에 보이는 것만큼 추가 작업이 많지 않다는 것을 배웠습니다. 실제로 프로젝트 시작부터 사용하면 계획에서 코딩까지의 프로세스가 상당히 자연스럽게 흐릅니다.

내 프로세스 분석



저에게 새로운 앱을 구축하는 과정은 순서도와 구성 요소 매핑을 사용하여 세부적으로 작업을 계획하는 것부터 시작됩니다. 필요한 구성 요소, 포함할 데이터, 상호 작용 방식 등을 결정합니다. 이것은 시간이 많이 걸리지만 개발 중에 재작업(및 좌절) 수준을 크게 줄여준다는 것을 배웠습니다. 다음은 최근 프로젝트의 예입니다.


여기에는 이와 유사한 사용자 스토리 생성도 포함됩니다. 이 세 가지 이야기는 또한 잠시 후에 예제로 사용할 것입니다.



페인 포인트(필요)
설명(어떻게?)


사용자
새로운 사용자로 등록
장치 등록

사용자
내 계정에 로그인
인증 장치

사용자
내 과거 주문 보기
프로필에서/users/:user_id/orders 경로로 이동


프로젝트를 매핑한 후에는 기본적으로 '페이지에서 무언가를 얻기' 위해 계획을 의사 코드로 변환합니다. 그런 다음 각 의사 함수를 통해 작업하여 실제 코드로 빌드합니다. 그러나 Jest 또는 Rspec과 같은 단위 테스트 언어를 보면 유사 코드와 비슷합니다. 그래서 내가 한 것은 유사 코드 단계를 발전시켜 단위 테스트를 작성하는 것입니다. 그들이 완성되었을 때만 나는 그들이 통과하도록 앱 기능을 구축하기 시작합니다. 익숙해지는 데 시간이 좀 걸리지만(아직 작업 중입니다) 결국에는 그만한 가치가 있을 것이라고 확신합니다.


전체 사이트 계획 워크플로

아래에서 이전과 이후를 볼 수 있습니다. 코드에는 Ruby(Rails)를 사용하고 테스트에는 Minitest를 사용하고 있습니다.

의사 코드(빨간색 상자)




# receive POST '/users/register' request with user_params: name, email, password
def register
  #  user = create new User instance
  #  check validations
  #  if user passes validations
    #  save user to database
    #  return user details
  #  else
    #  do not save user to database
    #  return failure message
  #  end
end

# receive POST '/users/signin' request with user_params: email, password
def login
  #  user = find User in database by params[:email]
  #  check params[:password] matches user.password
  #  if authenticated
    #  set current_user = user
    #  return user details
  #  else
    #  return failure message
  #  end
end

# receive GET '/orders' request
def past_orders
  #  current_user.orders.all
  #  return order details as JSON array
end


테스트(녹색 상자)




test 'can register valid user' do
  user = User.new(name: "Fake Guy", email: "[email protected]", password: "password")
  assert user.valid?, "user not valid"
end

test "user can log in with credentials" do
  users = [User.new(email: "[email protected]", password: "password")]
  user = users.find{|u| u.email == "[email protected]"}
  assert_equal user.password, "password"
end

test "user can see past orders" do
  user = User.new(name: "Fake Guy", email: "[email protected]", password: "password")
  one = Order.new(user_id: 1, Num_Items: 2, Total_Price: 400)
  two = Order.new(user_id: 1, Num_Items: 1, Total_Price: 200)
  three = Order.new(user_id: 2, Num_Items: 4, Total_Price: 800)
  assert_equal 2, user.orders.size
end


봐, 나쁘지 않아. 테스트는 의사 코드보다 약간 더 생각해야 하지만 실제 코드를 작성하는 동안 훨씬 더 유용하고 변경해야 할 때 훨씬 더 유용합니다. 이것이 저와 같이 "다른 모든 일이 진행되는 가운데 테스트에 몰두할 시간을 어떻게 찾을 수 있습니까?"

좋은 웹페이지 즐겨찾기