Re: How to break long method name into more than one line?

2012-03-14 Thread Herman
I followed the rule because it was a very good advice. For example,
def test_plus_1Plus1_2(self):
If this test fails, you immediately know that it's testing the plus
method, with 1  and 1 as the arguments, and expect to return 2.
Sticking this rule also means your test cases are small enough, so you
clearly know what you are testing on. Most of the time, the method
name is what you first see when your test fails. Another alternative
is to put meaningful string in each of the assert, which is probably
not practical. You are right, only people who really follow the TDD
method know the good things about it. This naming rule served me very
well.

Tests method should have meaningful name, and the advice by the book
is a meaningful one. I said it's the TDD book because I forgot the
exact title. It's actually called Test Driven: TDD and Acceptance TDD
for Java Developers. I thought it should be popular enough that most
people learned TDD may have heard it also used this naming advice, but
look like i was wrong.

 *The* TDD book? There's only one? Surely not.

 That rule sounds utterly impractical. I can't think of anything to
 recommend it. Like any other function, method or class, tests should have
 meaningful names, but reading the name alone should not necessarily tell
 you *everything* about the function.

 We have len, not len_sequence_or_mapping_int, and similarly it is
 perfectly reasonable to have test_len_empty rather than
 test_len_emptylist_emptystr_emptyunicode_emptydict_emptyset_emptytuple_zero.

 I expect that naming rule was invented by either people who have heard of
 test driven development, but never actually done it, or by people so
 anally-retentive that if they make seven short car trips over an hour,
 they check the tyre pressure, oil and water seven times because the
 manual says to check before *every* trip.

 No offence.

 My advice is to moderate the naming convention of your tests with a good
 dose of common sense and aim for names which are readable rather than
 names that contain everything including the kitchen sink. Imagine you are
 in a technical meeting with some of your fellow programmers, and need to
 ask for help with a failing test. Imagine saying the name of the test
 aloud in a sentence. Does it add clarity to the discussion, or obfuscate
 it?

 People's short term memory can only hold so much (allegedly seven plus
 or minus two), and if the name itself hits that limit, you leave nothing
 left for the rest of the sentence.

 http://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two

 Names should be practically, rather than conforming to some naming rule
 that hurts readability and obfuscates the tests.


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to break long method name into more than one line?

2012-03-14 Thread Terry Reedy

On 3/14/2012 4:53 PM, Herman wrote:

I followed the rule because it was a very good advice. For example,
def test_plus_1Plus1_2(self):


Suppose you want to test that a function call returns a particular 
300-char multiline string?



If this test fails, you immediately know that it's testing the plus
method, with 1  and 1 as the arguments, and expect to return 2.


If you use unittest and the right assert method, the message will say 
more than pass/fail. I believe .AssertEqual(a,b, 'optional message') 
will say that a is not equal to b, and print the optional message.


In addition, if first and second are the exact same type and one of 
list, tuple, dict, set, frozenset or str or any type that a subclass 
registers with addTypeEqualityFunc() the type-specific equality function 
will be called in order to generate a more useful default error message 
(see also the list of type-specific methods).


For instance
assertMultiLineEqual(first, second, msg=None)
Test that the multiline string first is equal to the string second. When 
not equal a diff of the two strings highlighting the differences will be 
included in the error message. This method is used by default when 
comparing strings with assertEqual().



Sticking this rule also means your test cases are small enough,


To me, it makes them too small. I think a test of addition should have 
multiple input-output pairs. Besides that, a single test output object 
may need to pass multiple conditions to pass. Putting them all in a 
single large conjuction would obscure which is not passing.


However, anything is better than no tests.

--
Terry Jan Reedy

--
http://mail.python.org/mailman/listinfo/python-list


Re: How to break long method name into more than one line?

2012-03-13 Thread Jean-Michel Pichavant

Chris Angelico wrote:

Just never treat them as laws of physics (in
Soviet Physics, rules break you!).

ChrisA
  


hum ...
I wonder how this political message is relevant to the OP problem.

JM

--
http://mail.python.org/mailman/listinfo/python-list


Re: How to break long method name into more than one line?

2012-03-13 Thread Chris Angelico
On Tue, Mar 13, 2012 at 9:30 PM, Jean-Michel Pichavant
jeanmic...@sequans.com wrote:
 Chris Angelico wrote:

 Just never treat them as laws of physics (in
 Soviet Physics, rules break you!).

 hum ...
 I wonder how this political message is relevant to the OP problem.

Ehh, it's a reference to the in Soviet Russia theme of one-liners.
You don't break the laws of physics, they break you. My point is that
rules about function names etc are *not* inviolate, and should be
treated accordingly.

ChrisA
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to break long method name into more than one line?

2012-03-12 Thread Chris Angelico
On Tue, Mar 13, 2012 at 3:24 AM, Dennis Lee Bieber
wlfr...@ix.netcom.com wrote:
 On 12 Mar 2012 00:30:08 GMT, Steven D'Aprano
 steve+comp.lang.pyt...@pearwood.info declaimed the following in
 gmane.comp.python.general:
 I expect that naming rule was invented by either people who have heard of
 test driven development, but never actually done it, or by people so
 anally-retentive that if they make seven short car trips over an hour,
 they check the tyre pressure, oil and water seven times because the
 manual says to check before *every* trip.

        By which time they find they have to add air, oil, and water as: the
 pressure gauge usage lets out some air each time; they've wiped a few
 drops of oil onto a rag each time; and the radiator was still
 hotpressurized such that they got an overfull result.

In defense of such rules: There's a period in every new programmer's
life when it helps to learn a whole lot of principles; and if he's
working on some collaborative project, rules are the easiest way to
demand such behavior. Later on, you learn how and when it's safe to
break the rules (and/or how to deal with rule conflicts), but the
rules still have value. Just never treat them as laws of physics (in
Soviet Physics, rules break you!).

ChrisA
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to break long method name into more than one line?

2012-03-11 Thread Roy Smith
In article mailman.571.1331492028.3037.python-l...@python.org,
 Herman sorsor...@gmail.com wrote:

 I am trying to stick to the rule described in the TDD book that, each
 test method name consists of the method name to be tested, inputs and
 the expected outputs. It takes up a lot of space and my company has a
 rule of limiting 79 characters (or 80) per line. I found that
 def abcdeef\
 dddaaa(self):
 pass
 
 does not work, but
 def \
 abcsajfoijfiawifoiwejfoi(self):
 pass
 
 works. Is this the only way to do it?

Ahhhg.  If you can't fit a test method name into 79 
characters, you're doing somthing wrong.  Just for fun, I found all the 
test methods in the project I'm working on and sorted them by length.  
Here's the top of the list:

$ find . -name 'test*py' | xargs grep -h 'def *test' | sort | uniq  | 
awk '{print length($0), $0}' | sort -nr
55 def test_update_name_changes_dasherized_name(self):
51 def test_get_followers_with_no_followers(self):
50 def test_update_station_song_adds_false(self):
50 def test_anonymous_get_user_collections(self):
49 def test_wrong_user_update_should_fail(self):
49 def test_login_with_email_and_password(self):
47 def test_unknown_station_returns_404(self):
47 def test_login_failure_with_facebook(self):
47 def test_get_follows_with_no_follows(self):
46 def test_station_by_dasherized_name(self):
46 def test_nonexistent_recent_station(self):
46 def test_new_user_with_display_name(self):
46 def test_auto_connect_with_facebook(self):
46 def test_anonymous_created_stations(self):
45 def test_no_php_fatal_error_in_log(self):
45 def test_get_only_songza_followers(self):
45 def test_anonymous_vote_transition(self):
44 def test_non_ascii_global_station(self):
44 def test_global_station_not_found(self):
44 def test_gallery_create_duplicate(self):
44 def test_anonymous_listen_history(self):

and so on down to the wonderfully terse:

21 def test_x(self):

which I'm assuming actually makes sense in the context of the TestCase 
class it belongs to.  At least I hope it does :-)

The examples above are a reasonable upper limit on the verbosity you 
should be shooting for, IMHO.
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to break long method name into more than one line?

2012-03-11 Thread Steven D'Aprano
On Sun, 11 Mar 2012 11:53:45 -0700, Herman wrote:

 I am trying to stick to the rule described in the TDD book that, each
 test method name consists of the method name to be tested, inputs and
 the expected outputs.

*The* TDD book? There's only one? Surely not.

That rule sounds utterly impractical. I can't think of anything to 
recommend it. Like any other function, method or class, tests should have 
meaningful names, but reading the name alone should not necessarily tell 
you *everything* about the function.

We have len, not len_sequence_or_mapping_int, and similarly it is 
perfectly reasonable to have test_len_empty rather than 
test_len_emptylist_emptystr_emptyunicode_emptydict_emptyset_emptytuple_zero.

I expect that naming rule was invented by either people who have heard of 
test driven development, but never actually done it, or by people so 
anally-retentive that if they make seven short car trips over an hour, 
they check the tyre pressure, oil and water seven times because the 
manual says to check before *every* trip.

No offence.

My advice is to moderate the naming convention of your tests with a good 
dose of common sense and aim for names which are readable rather than 
names that contain everything including the kitchen sink. Imagine you are 
in a technical meeting with some of your fellow programmers, and need to 
ask for help with a failing test. Imagine saying the name of the test 
aloud in a sentence. Does it add clarity to the discussion, or obfuscate 
it?

People's short term memory can only hold so much (allegedly seven plus 
or minus two), and if the name itself hits that limit, you leave nothing 
left for the rest of the sentence.

http://en.wikipedia.org/wiki/The_Magical_Number_Seven,_Plus_or_Minus_Two

Names should be practically, rather than conforming to some naming rule 
that hurts readability and obfuscates the tests.


 It takes up a lot of space and my company has a
 rule of limiting 79 characters (or 80) per line. I found that def
 abcdeef\
 dddaaa(self):
 pass
 
 does not work, but
 def \
 abcsajfoijfiawifoiwejfoi(self):
 pass
 
 works. Is this the only way to do it?

Yes. You can't split tokens over multiple lines, or put any whitespace 
between them.


-- 
Steven
-- 
http://mail.python.org/mailman/listinfo/python-list


Re: How to break long method name into more than one line?

2012-03-11 Thread Roy Smith
In article 4f5d4390$0$29891$c3e8da3$54964...@news.astraweb.com,
 Steven D'Aprano steve+comp.lang.pyt...@pearwood.info wrote:

 You can't split tokens over multiple lines, or put any whitespace 
 between them.

Well, if you truly wanted to be perverse, you could write some kind of 
decorator:

@make_long_named_test_method('some',
 'very',
 'long',
 'list',
 'of',
 'token',
 'fragments')
def x(self):
   blah, blah, blah

which creates a test_some_very_long_list_of_token_fragments method.  
But it would be a lot easier to just use sane method names.
-- 
http://mail.python.org/mailman/listinfo/python-list