programing

Rails 앱에서 사용하지 않는 코드 찾기

nasanasas 2020. 11. 18. 09:14
반응형

Rails 앱에서 사용하지 않는 코드 찾기


프로덕션 에서 실행중인 코드와 실행되지 않는 코드를 어떻게 찾 습니까?

앱은 잘 테스트되었지만 사용하지 않는 코드 를 테스트하는 많은 테스트가 있습니다. 따라서 그들은 테스트를 실행할 때 커버리지를 얻습니다.이 문제를 리팩토링하고 정리하고 싶습니다. 계속해서 시간을 낭비하고 있습니다. 저는 배경 작업이 많기 때문에 프로덕션 환경이 저를 안내하고 싶습니다. heroku에서 실행하면 프로파일 러의 성능 영향을 보상하기 위해 다이노를 스핀 업할 수 있습니다.

관련 질문 Ruby 앱에서 사용하지 않는 메서드를 찾으려면 어떻게해야합니까? 도움이되지 않습니다.

보너스 : 한 줄의 코드가 실행되는 빈도를 보여주는 메트릭입니다. 내가 왜 원하는지 모르겠지만 그래요! :)


일반적인 상황에서 접근 방식은 코드 커버리지를 위해 테스트 데이터를 사용하는 것이지만 테스트되었지만 프로덕션 앱에서 사용되지 않는 코드 부분이 있다고 말했듯이 약간 다른 작업을 수행 할 수 있습니다.

먼저 명확성을 위해 : 자동 도구를 신뢰하지 마십시오. 그들은 당신이 적극적으로 테스트하는 것에 대한 결과만을 보여줄 것입니다.

면책 조항 을 통해 프로덕션 앱 에서 코드 커버리지 도구 (예 : Ruby 1.9의 경우 rcov 또는 simplecov )를 사용하고 사용자가 실제로 사용하는 코드 경로를 측정 할 것을 제안합니다 . 이러한 도구는 원래 테스트 범위를 측정하기 위해 설계되었지만 프로덕션 범위에도 사용할 수 있습니다.

테스트 기간 동안 모든 관련 코드 경로를 방문한다는 가정하에 나머지는 제거 할 수 있습니다. 안타깝게도이 가정은 아마도 완전히 유지되지 않을 것입니다. 따라서 부품을 제거 할 때 앱과 내부 작동에 대한 지식을 적용해야합니다. 선언적 부분 (모델 참조와 같은)을 제거 할 때 이는 종종 직접 실행되지 않고 시스템의 다른 부분을 구성하는 데만 사용되기 때문에 더욱 중요합니다.

위와 결합 할 수있는 또 다른 접근 방식은 앱을 켜고 끌 수있는 고유 한 기능으로 리팩터링하는 것입니다. 그런 다음 사용하지 않는 것으로 의심되는 기능을 끄고 아무도 불평하지 않는지 확인할 수 있습니다. :)

그리고 마지막으로, 전체 분석을 수행 할 수있는 마법 도구를 찾을 수 없습니다. 특정 코드가 실제 사용자가 사용하는지 여부를 도구가 알 수 없기 때문입니다. 도구가 할 수있는 유일한 일은 정적 도달 가능성 그래프를 생성하여 코드가 특정 지점에서 호출되는지 여부를 알려주는 것입니다. Ruby와 같은 동적 언어를 사용하면 정적 분석이 레일 컨텍스트에서 많이 사용되는 메타 프로그래밍 또는 동적 호출에 대해 많은 통찰력을 얻지 못하므로 달성하기가 다소 어렵습니다. 따라서 일부 도구는 실제로 코드를 실행하거나 테스트 범위에서 통찰력을 얻으려고합니다. 그러나 확실히 마법 주문은 없습니다.

따라서 레일 애플리케이션의 높은 내부 (대부분 숨겨진) 복잡성을 고려할 때 대부분의 분석을 수작업으로 수행하지 못할 것입니다. 가장 좋은 조언은 앱을 모듈화하고 특정 모듈을 꺼서 사용하지 않는지 테스트하는 것입니다. 이는 적절한 통합 테스트를 통해 지원 될 수 있습니다.


사용하지 않는 메소드와 클래스를 확인하기 위해 rails_best_practices를 사용할 수 있습니다.

여기 github에 있습니다 : https://github.com/railsbp/rails_best_practices .

Gemfile에 'gem "rails_best_practices"'를 넣고 실행 rails_best_practices .하여 구성 파일을 생성합니다.


체크 아웃 coverband의 보석, 당신이 정확하게 당신이 찾고있는 무엇 무엇을하지 않습니다.


나는 똑같은 문제가 있었고 몇 가지 대안을 탐색 한 후 모든 정보를 즉시 사용할 수 있다는 것을 깨달았습니다. 로그 형식은 다음과 같습니다.

Dec 18 03:10:41 ip-xx-xx-xx-xx appname-p[7776]:   Processing by MyController#show as HTML

그래서이 정보를 구문 분석하는 간단한 스크립트를 만들었습니다.

zfgrep Processing production.log*.gz |awk '{print $8}' > ~/tmp/action

sort  ~/tmp/action | uniq -c |sort -g -r > ~/tmp/histogram

주어진 controller # action에 얼마나 자주 액세스했는지에 대한 결과를 생성했습니다.

4394886 MyController#index
3237203 MyController#show
1644765 MyController#edit

다음 단계는 앱의 모든 controller # action 쌍 목록과 비교하는 것입니다 (rake 라우트 출력을 사용하거나 테스트 스위트에 대해 동일한 스크립트를 수행 할 수 있음).


저는 Ruby와 RoR에 익숙하지 않지만 미친 추측을 제안합니다.

  • :after_filter이전에 호출 된 메서드의 이름을 기록하는 메서드 추가 (호출 스택에서 가져옴)를 파일에 추가합니다.
  • 프로덕션에 배포
  • 잠시 기다려
  • 로그에없는 모든 메소드를 제거하십시오.

ps 아마도 NetBeans 또는 RubyMine에서 Alt + F7을 사용하는 솔루션이 훨씬 낫습니다. :)


이미 의심스러운 메서드를 비공개로 표시하는 아이디어를 얻었습니다 (응용 프로그램이 손상 될 수 있음).

내가 과거에 한 작은 변형 : 모든 의심스러운 방법에 작은 코드를 추가하여 기록합니다. 제 경우에는 "구식 기능을 호출했습니다. 정말 필요한 경우 IT 부서에 문의하십시오"라는 사용자 팝업이었습니다. 1 년 후 우리는 실제로 사용 된 것이 무엇인지 좋은 개요를 얻었습니다 (비즈니스 애플리케이션이었고 일년에 한 번만 기능이 필요한 곳이었습니다).

귀하의 경우에는 사용량 만 기록해야합니다. 합리적인 기간 이후에 기록되지 않은 모든 것은 사용되지 않습니다.


메타 프로그래밍

Object # method_missing

재정의 Object#method_missing. 내부에서 호출하는 Class메서드 를 비동기 적으로 데이터 저장소에 기록합니다. 그런 다음에 전달 된 인수를 기반으로 적절한 인수를 사용하여 원래 메서드를 수동으로 호출합니다 method_missing.

개체 트리

그런 다음 데이터 저장소의 데이터를 응용 프로그램 개체 트리의 내용과 비교합니다.

면책 조항 : 이것은 확실히 상당한 성능과 자원 고려를 요구할 것입니다. 또한 작동하려면 약간의 수정이 필요하지만 이론적으로는 작동해야합니다. 나는 그것을 구현하기 위해 원래 포스터에 연습으로 남겨 둘 것입니다. ;)


당신은 같은 것을 사용하여 테스트 스위트를 만드는 시도 sahi을 사용하면 다음이를 사용하는 모든 사용자 journies를 기록하고 rcov 또는 비슷한에 그 테스트를 묶을 수 있습니다.

You do have to ensure you have all user journies but after that you can look at what rcov spits out and at least start to prune out stuff that is obviously never covered.


This isn't a very proactive approach, but I've often used results gathered from New Relic to see if something I suspected as being unused had been called in production anytime in the past month or so. The apps I've used this on have been pretty small though, and its decently expensive for larger applications.

I've never used it myself, but this post about the laser gem seems to talk about solving your exact problem.


It is not the perfect solution, but for example in NetBeans you can find usages of the methods by right click on them (or press Alt+F7).
So if method is unused, you will see it.


mark suspicious methods as private. If that does not break the code, check if the methods are used inside the class. then you can delete things

참고URL : https://stackoverflow.com/questions/9735307/find-unused-code-in-a-rails-app

반응형