wp_query return nothing

You need to reference to your query, when starting the loop, otherwise it will show the posts found with the main query, instead of your custom query.

Try:

<?php

    $args = array( 'post_type'=>'book'); 
    $loop = new WP_Query( $args );

    // Start the loop for your custom query
    if($loop->have_posts() ) : while ($loop->have_posts() ) : $loop->the_post();

    the_title(); // just an example, output what you need here

    // Get the post terms
    $term_list = wp_get_post_terms($post->ID, 'best-book', array("fields" => "all"));

    // Iterate the terms, if found
    if($term_list) {
        foreach($term_list as $term_single) {
            echo $term_single;
        }
    }

    endwhile;

    // In case the query is empty
    else:

    // Debug the query
    echo '<pre>';
    var_dump($loop);
    echo '</pre>';

    endif;

?>