在SSL下运行Rails系统测试表现出奇怪的行为,我不确定这是一个错误还是设计错误。
这个非常基本的Example Application有一个系统测试,可以在索引页面上查找元素。
git clone https://github.com/frankjmattia/rails-ssl-system-tests.git blorgh
cd blorgh
./bin/setup
此时,您必须创建自签名证书并指示您的操作系统信任它。
./bin/generate-blorgh-cert blorgh.test
这将生成证书和打印方向,以便在Mac OS X或Ubuntu上信任它。这对https://blorgh.test
,https://127.0.0.1
和https://localhost
有效
rake
进行系统测试
要么
rails s
启动服务器,然后导航到https://localhost:3000
当他们运行测试时,我会在我提出请求之前从Puma中抛出一个错误。
frankjmattia@lappy-i686 % rake
Run options: --seed 43000
# Running:
Capybara starting Puma...
* Version 3.12.1 , codename: Llamas in Pajamas
* Min threads: 1, max threads: 1
* Listening on ssl://127.0.0.1:56260?key=/Users/frankjmattia/src/blorgh/ssl/blorgh.test.key.pem&cert=/Users/frankjmattia/src/blorgh/ssl/blorgh.test.cert.pem
2019-04-28 16:59:48 -0400: SSL error, peer: 127.0.0.1, peer cert: , #<Puma::MiniSSL::SSLError: OpenSSL error: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request - 336027804>
2019-04-28 16:59:49 -0400: SSL error, peer: 127.0.0.1, peer cert: , #<Puma::MiniSSL::SSLError: OpenSSL error: error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request - 336027804>
.
Finished in 3.177669s, 0.3147 runs/s, 0.3147 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
2019-04-28 16:59:49 -0400: Read error: #<EOFError: EOFError>
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/client.rb:306:in `try_to_finish'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/client.rb:119:in `reset'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/server.rb:486:in `process_client'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/server.rb:334:in `block in run'
/Users/frankjmattia/.asdf/installs/ruby/2.6.2/lib/ruby/gems/2.6.0/gems/puma-3.12.1/lib/puma/thread_pool.rb:135:in `block in spawn_thread'
我认为这是来自Capybara服务器检查responsive?
但我不知道如何证明它或解决它。
此外,即使所有测试都在本地传递,它们也会在像SemaphoreCI这样的CI平台上运行时挂起。
如果这是一个错误,那是谁的错误呢?一世 我倾向于水豚但是 如果我没有所有的事实,或者不能充分描述它,我不想浪费任何时间提交错误报告。
当Capybara在等待服务器启动时尝试向服务器发出http请求并确定它是http还是https时,OpenSSL会输出SSL“错误”。收到错误后,Capybara会重试为https请求。除了正在输出的消息之外,实际上不会影响任何错误,并且没有理由“错误”应该导致SemaphoreCI挂起。
如果Semaphore正在使用docker平台并且您运行Chrome> = 73,您可能会发现需要将命令行选项--no-sandbox
和--disable-features='VizDisplayCompositor'
传递给Chrome才能正常运行。
不知道EOFError是关于什么虽然它可能与您在请求页面时切换app_host有关(在访问返回时不保证页面加载完成)
不这样做是解决这个问题的原因。在我的案例中,将额外选项传递给chromedriver是不必要的。