LDAP 서버를 사용한 Rails 오이 테스트
-
12-09-2019 - |
문제
인증을 위해 AuthLogic을 사용하는 응용 프로그램에 대한 오이 테스트를 작성하려고하지만 실제로 LDAP 서버에 사용자를 저장합니다.
응용 프로그램은 잘 작동하는 것처럼 보이지만 문제가 발생하는 곳은 테스트를 작성하는 것입니다 (테스트를 먼저 작성해야한다는 것을 알고 있습니다.) LDAP 서버는 각 실행이지만 쉽지는 않습니다.
내 아이디어는 레이크 작업 (예 : 레이크 LDAP : 테스트 : 준비)을 작성하여 각 실행 전에 LDAP 서버를 새로 고치는 것 (또는 종속성을 만들기 위해)이지만 테스트 작업을 수행 할 때는 시간이 많이 걸리는 것 같습니다 (그리고 Autotest를 가까이하게 만드는 것 같습니다. 불가능한.)
더 좋은 방법이 있습니까? 사전 정의 된 비품으로 바인딩 할 수있는 루비 기반 가짜 LDAP 서버가 있습니까? 내가 생각하지 않는 다른 더 우아한 솔루션이 있습니까? (LDAP를 사용하지 않는 것은 옵션이 아닙니다.)
해결책
따라서 일반적으로 오이 테스트는 통합 및 수락 테스트를위한 것입니다. 이 경우 시스템 엔드 투 엔드를 테스트해야하므로 LDAP 통합도 테스트해야합니다. 내 제안은 당신이 그것을 스윙 할 수 있다면, 다른 LDAP 서버를 설정하고 라이브 서버에서 주기적 덤프를 수행하여 필요한 테스트 데이터로 설정하는 것입니다.
나는 각 실행 전에 LDAP DB를 새로 고치는 의존성을 갖는 첫 번째 아이디어가 "올바른"방법이라고 말할 것입니다. 통합/수락 테스트입니다 추정된 오랜 시간이 걸립니다. 작은 (단위) 조각뿐만 아니라 시스템의 기능 전체를 테스트하고 있습니다.
오이는 단위 테스트 프레임 워크가 아니므로 그런 식으로 사용해서는 안됩니다. 테스트가 없었기 때문에 2.3.4로 마이그레이션 한 후 신청서가 끊어지면 거기에 들어가서 단위 테스트를 시작해야한다고 생각합니다 ...
이제 이것은 내 개인적인 편견이지만, 단위 테스트가 없다면 RSPEC를 살펴 보겠습니다. 오이의 영어와 같은 구문이 마음에 들면 RSPEC은 분명히 비슷하게 느껴질 것입니다. Test :: Unit에서 이미 다소 테스트 된 경우 Test :: Unit Framework 내에서 RSPEC 느낌을 얻기 위해 Doolsa를 파티에 가져 오거나 컨텍스트/일성 (GitHub에서 사용할 수 있음)을 확실히 제안합니다.
다른 팁
Ladle을 테스트 LDAP 서버로 사용하십시오. "Ladle은 RSPEC, 오이 또는 기타 Ruby 테스트 프레임 워크와 함께 테스트하는 데 사용하기위한 LDAP (Lightweight Directory Access)의 도움을 줄 것입니다."
마침내 각 오이 시나리오가 실행되기 전에 기본적으로 LDAP 서버를 청소할 수있었습니다. 나는 오이에 고리를 추가하여 이것을했다
Before do |scenario|
puts "Cleaning Up LDAP Server"
LdapConnect.new(:admin => true).clear_users!
end
그런 다음 LDAPConnect 클래스 (여러 모델이 LDAP 서버를 터치해야 하므로이 개체를 전달할 수 있습니다). LDAP 상호 작용을 위해 Ruby-Net-Ldap 보석을 사용하고 있습니다
class LdapConnect
def initialize(params = {})
ldap_config = YAML.load_file("#{RAILS_ROOT}/config/ldap.yml")[RAILS_ENV]
ldap_options = params.merge({:encryption => :simple_tls})
@ldap = Net::LDAP.new(ldap_options)
@ldap.host = ldap_config["host"]
@ldap.port = ldap_config["port"]
@ldap.base = ldap_config["base"]
@ldap.auth ldap_config["admin_user"], ldap_config["admin_password"] if params[:admin]
end
def ldap
@ldap
end
def clear_users!(base = "ou=people,dc=test,dc=com")
raise "You should ONLY do this on the test enviornment! It will clear out all of the users in the LDAP server" if RAILS_ENV != "test"
if @ldap.bind
@ldap.search(:filter => "cn=*", :base => base) do |entry|
@ldap.delete(:dn => entry.dn)
end
end
end
end
그래서 내 오이 기능은 다음과 같습니다.
Feature: Check to make sure users can login
In order to make sure users can login with the LDAP server
As a user
I want to make sure the user can login
Background:
Given I have the following users
| email | password | user_class | first_name | last_name |
| external@test.com | right_password | externalPerson | external | person |
| internal@test.com | right_password | internalPerson | internal | person |
| admin@test.com | right_password | adminPerson | admin | person |
Scenario: Success Login Check
Given I am logged in as "external@test.com" with password "right_password"
Then I should be on the homepage
그리고 마지막으로 단계
Given /^I have the following users$/ do |table|
# table is a Cucumber::Ast::Table
table.hashes.each do |hash|
hash[:password_confirmation] == hash[:password] unless hash[:password_confirmation]
User.create(hash)
end
end
Given /^I am logged in as "([^\"]*)" with password "([^\"]*)"$/ do |email, password|
visit login_url
fill_in "Email", :with => email
fill_in "Password", :with => password
click_button "Login"
end
나는 방금 이것을 직접 조사해 왔으며, 다소 라다 파 켈 딥 보석을 가로 질러왔다.
http://github.com/aanand/fakeldaphttp://rubygems.org/gems/fakeldap
나는 그것을 사용한 후에이 답변을 약간의 경험으로 추가 할 수 있습니다.
실제로 대답은 아니지만 ... 오이로 LDAP 인증 및 조회 코드를 테스트하는 매우 유사한 문제를 해결하고 있습니다. 테스트에서 스터브를 사용해 보셨습니까? 나는 내 LDAP 응답을 스터브 할 생각을하고 있었다. 단지 아직 어떻게 해야할지 모른다.
매트