2010-06-21 39 views
12

Tôi chưa sử dụng khả năng thử nghiệm được xây dựng của Django và Python, nhưng tôi muốn bắt đầu ... Và một trong những điều rõ ràng nhất mà tôi muốn kiểm tra trong toàn bộ quá trình phát triển là tất cả các trang xác thực trong tất cả các tình huống có thể xảy ra.Làm cách nào để xác thực HTML trong các mẫu Django trong quá trình phát triển?

Cách tốt nhất để làm điều này là gì?

Trả lời

7

Câu hỏi hay. Tôi đã không làm điều này bản thân mình, vì vậy hy vọng sẽ có một số câu trả lời tốt hơn, nhưng bạn có thể muốn xem xét xác nhận HTML middleware:

“ trong tất cả các tình huống có thể xảy ra ”có thể là quá nhiều để yêu cầu, tùy thuộc vào ứng dụng của bạn. Ví dụ, nếu bạn làm cho Facebook tiếp theo, và do đó chấp nhận một lượng lớn dữ liệu người dùng mỗi ngày, một cái gì đó sẽ đến tại một số điểm mà phá vỡ tính hợp lệ của một trang trên trang web của bạn. Khi các lỗi xác nhận không có xu hướng hủy bỏ chức năng, nó có thể là một cách tiếp cận có thể chấp nhận được để kiểm tra với một số dữ liệu kiểm tra giới hạn, sau đó phản ứng với các lỗi khi chúng xuất hiện. Tôi tin rằng điều này được gọi là stupidity-driven testing.

+0

Cảm ơn :) Tôi sẽ xem xét. Tôi đã nhìn thấy các liên kết đoạn trước nhưng phần còn lại là mới với tôi (và tôi yêu các khái niệm thử nghiệm ngu ngốc theo định hướng: D). Vâng, tôi cho rằng "tất cả các tình huống có thể xảy ra" đang đòi hỏi quá nhiều - chỉ bằng cách sử dụng các trang phẳng có thể giới thiệu nhiều HTML không hợp lệ vào một trang web. Tuy nhiên, tôi vẫn tò mò liệu có bất kỳ giải pháp nào trong app.py_START kiểm tra app_name tĩnh mạch hay không và cách thực tiễn của điều đó so với cách tiếp cận middleware so sánh. Yêu câu trả lời của bạn mặc dù :) –

+0

Chắc chắn, gấp nó vào quá trình thử nghiệm của bạn. Không chắc chắn nếu có ai làm công việc khó khăn, nhưng tôi đoán bạn cần một cách để đi qua các url của bạn.py' và tạo nhiều URL có thể cho trang web nhất có thể. Sau đó, bạn có thể sử dụng [trình kiểm tra Django được tích hợp sẵn] (http://docs.djangoproject.com/en/dev/topics/testing/#module-django.test.client) để tìm nạp tất cả các url đó, và [một cái gì đó để xác thực chúng] (http://stackoverflow.com/questions/35538/validate-xhtml-in-python). –

+0

Cảm ơn, tôi nghĩ hai câu trả lời của bạn là tất cả những gì tôi cần :) Bây giờ, tôi có thể thử những gì tốt nhất cho tôi và trong hoàn cảnh nào :) –

2

Ngoài ra, một cách tiếp cận roll-bạn-riêng để xác nhận các trang trên trang web của bạn trong quá trình kiểm tra đơn vị thông thường của bạn sẽ trông như thế này:

  1. Đi qua urls.py bạn và tạo ra càng nhiều URL có thể cho trang web như bạn có thể
  2. Sử dụng the built-in Django test client để lấy mỗi người url
  3. Validate họ bằng cách nào đó (Xem lẽ Validate (X)HTML in Python)

Không chắc chắn nếu có ai thực hiện bất kỳ công việc nào trên đây là cách tái sử dụng.

1

Một giải pháp là tạo một tập lệnh để hiển thị tất cả các mẫu dựa trên từ điển đầu vào của các giá trị thử nghiệm biến.

Logic chính để lấy danh sách các biến được định nghĩa trong các mẫu như sau:

from django.template.loader import get_template 

def extract_required_vars(node): 
    if not hasattr(node, 'nodelist'): 
     return [] 
    var_names = [] 
    for child_node in node.nodelist: 
     if isinstance(child_node, VariableNode): 
      var_names.append(child_node.filter_expression.token) 
     elif isinstance(child_node, ForNode): 
      var_names.append(child_node.sequence.var.var) 
     elif isinstance(child_node, ExtendsNode): 
      template = get_template(child_node.parent_name.var) 
      var_names.extend(extract_required_vars(template)) 
     elif isinstance(child_node, IncludeNode): 
      template = get_template(child_node.template.var) 
      var_names.extend(extract_required_vars(template)) 
     var_names.extend(extract_required_vars(child_node)) 
    return var_names 

required_vars = extract_required_vars(get_template('index.html')) 

Kịch bản sau đó kiểm tra rằng các biến được định nghĩa trong các mẫu hoặc là trong các thiết lập dự án hoặc trong dict cung cấp bởi người dùng làm đầu vào thử nghiệm.

/path/to/project/templates/templates/allusers.html 
    -> ok: users, STATIC_URL 
/path/to/project/templates/entrer-en-contact.html 
    -> ok: contactform, STATIC_URL 
/path/to/project/templates/dest-summary.html 
    -> ok: STATIC_URL 
    -> missing: dest_username 

Chi tiết khác in this blog post.

Các vấn đề liên quan