RubysUnicodeサポートのテスト
Ruby 2.4に同梱されている新機能の中には、改善されたUnicodeサポートがあります。具体的には、upcase
のようなメソッド およびdowncase
「ä」を「Ä」に変えて、元に戻します。これは私に興味をそそられました:AndréArkoのブログ投稿を読んだ2013年以降、他にどのようなUnicodeの改善がなされましたか?Rubyの文字列はUTF-8になりました…そうですか??
私はRubyのすべての文字列メソッドをテストしました。技術的なエラーではなく、「驚き最小の原則」の違反を探しました。具体的には、私の仮定は次のとおりでした:
- ユニークなキャラクターはユニークです: 「e」と「ë」は、「e」と「E」と同じように異なります。
- 単一の文字は単一の文字としてカウントされます それらがUnicodeでどのように表現されていても。これは、後者が2つのコードポイントで表されている場合でも、「e」と「ë」がそれぞれ1文字であることを意味します。
- 文字は不変です。 文字列を逆にしても、個々の文字は変更されません。
- 空白は空白として扱われます。 それらのトリッキーなユニコード空白文字ですら。
- 数字は数字として扱われます。 2番は、どのように書かれても常に2番です。
残念ながら、Rubyの文字列操作メソッドのほとんどはこれらのテストに失敗します。したがって、Unicode文字列を使用している場合は、使用する文字列に細心の注意を払う必要があります。
注:公開後、一部の読者は、Unicodeテスト文字列を正規化した場合、私が言及した失敗の多くは発生しなかったと指摘しました。これは本当です。ただし、文字列はRubyまたはRailsによって自動的に正規化されません(私がテストしたどのアプリでも)。これらのテストは常に最悪のケースを説明することを目的としており、その点ではまだ有用だと思います。
Ruby2.4.0を使用したUnicodeテスト
メソッド | テスト | 期待される | 結果 | 評決 |
---|---|---|---|---|
#% | "%s" % "noël" | "noël" | "noël" | OK |
#* | "noël" * 2 | "noëlnoël" | "noëlnoël" | OK |
#<< | "noël" << "ë" | "noëlë" | "noëlë" | OK |
#<=> | "ä" <=> "z" | -1 | -1 | OK |
#== | "ä" == "ä" | true | true | OK |
#=〜 | "ä" =~ /a./ | nil | 0 | 注意してください! |
#[] | "ä"[0] | "ä" | "a" | 注意してください! |
#[] = | "ä"[0] = "u" | "u" | "u" | OK |
#b | "ä".b.encoding.to_s | "ASCII-8BIT" | "ASCII-8BIT" | OK |
#bytes | "ä".bytes | [97, 204, 136] | [97, 204, 136] | OK |
#bytesize | "ä".bytesize | 3 | 3 | OK |
#byteslice | "ä".byteslice(1) | "\xCC" | "\xCC" | OK |
#capitalize | "ä".capitalize | "Ä" | "Ä" | OK |
#casecmp | "äa".casecmp("äz") | -1 | -1 | OK |
#center | "ä".center(3) | "ä" | "ä" | 注意してください! |
#chars | "ä".chars | ["ä"] | ["a", "̈"] | 注意してください! |
#chomp | "ä
".chomp | "ä" | "ä" | OK |
#chop | "ä".chop | "" | "a" | 注意してください! |
#chr | "ä".chr | "ä" | "a" | 注意してください! |
#clear | "ä".clear | "" | "" | OK |
#codepoints | "ä".codepoints | [97, 776] | [97, 776] | OK |
#concat | "ä".concat("x") | "äx" | "äx" | OK |
#count | "ä".count("a") | 0 | 1 | 注意してください! |
#crypt | "123".crypt("ää") == "123".crypt("aa") | false | false | OK |
#delete | "ä".delete("a") | "ä" | "̈" | 注意してください! |
#downcase | "Ä".downcase | "ä" | "ä" | OK |
#dump | "ä".dump | "\"a\\u0308\"" | "\"a\\u0308\"" | OK |
#each_byte | "ä".each_byte.to_a | [97, 204, 136] | [97, 204, 136] | OK |
#each_char | "ä".each_char.to_a | ["ä"] | ["a", "̈"] | 注意してください! |
#each_codepoint | "ä".each_codepoint.to_a | [97, 776] | [97, 776] | OK |
#each_line | "ä".each_line.to_a | ["ä"] | ["ä"] | OK |
#empty? | "ä".empty? | false | false | OK |
#encode | "ä".encode("ASCII", undef: :replace) | "a?" | "a?" | OK |
#encoding | "ä".encoding.to_s | "UTF-8" | "UTF-8" | OK |
#end_with? | "ä".end_with?("ä") | true | true | OK |
#eql? | "ä".eql?("a") | false | false | OK |
#force_encoding | "ä".force_encoding("ASCII") | "a\xCC\x88" | "a\xCC\x88" | OK |
#getbyte | "ä".getbyte(2) | 136 | 136 | OK |
#gsub | "ä".gsub("a", "x") | "ä" | "ẍ" | 注意してください! |
#hash | "ä".hash == "a".hash | false | false | OK |
#include? td> | "ä".include?("a") | false | true | 注意してください! |
#index | "ä".index("a") | nil | 0 | 注意してください! |
#replace | "ä".replace("u") | "u" | "u" | OK |
#insert | "ä".insert(1, "u") | "äu" | "aü" | 注意してください! |
#inspect | "ä".inspect | "\"ä\"" | "\"ä\"" | OK |
#intern | "ä".intern | :ä | :ä | OK |
#length | "ä".length | 1 | 2 | 注意してください! |
#ljust | "ä".ljust(3, "_") | "ä__" | "ä_" | 注意してください! |
#lstrip | " ä".lstrip | "ä" | "ä" | OK |
#match | "ä".match("a") | nil | # | 注意してください! |
#next | "ä".next | "ä" | "b̈" | 注意してください! |
#ord | "ä".ord | 97 | 97 | OK |
#partition | "händ".partition("a") | ["händ"] | ["h", "a", "̈nd"] | 注意してください! |
#prepend | "ä".prepend("ä") | "ää" | "ää" | OK |
#replace | "ä".replace("ẍ") | "ẍ" | "ẍ" | OK |
#reverse | "händ".reverse | "dnäh" | "dn̈ah" | 注意してください! |
#rpartition | "händ".rpartition("a") | ["händ"] | ["h", "a", "̈nd"] | 注意してください! |
#rstrip | "line ".rstrip | "line" | "line" | 注意してください! |
#scrub | "ä".scrub | "ä" | "ä" | OK |
#setbyte | s = "ä"; s.setbyte(0, "x".ord); s | "ẍ" | "ẍ" | OK |
#size | "ä".size | 1 | 2 | 注意してください! |
#slice | "ä".slice(0) | "ä" | "a" | 注意してください! |
#split | "ä".split("a") | ["ä"] | ["", "̈"] | 注意してください! |
#squeeze | "ää".squeeze("ä") | "ä" | "ää" | 注意してください! |
#start_with? | "ä".start_with?("a") | false | true | 注意してください! |
#strip | " line ".strip | "line" | "line" | 注意してください! |
#sub | "ä".sub("a", "x") | "ä" | "ẍ" | 注意してください! |
#succ | "ä".succ | "b̈" | "b̈" | OK |
#swapcase | "ä".swapcase | "Ä" | "Ä" | OK |
#to_c | "١".to_c | (1+0i) | (0+0i) | 注意してください! |
#to_f | "١".to_f | 1.0 | 0.0 | 注意してください! |
#to_i | "١".to_i | 1 | 0 | 注意してください! |
#to_r | "١".to_r | (1/1) | (0/1) | 注意してください! |
#to_sym | "ä".to_sym | :ä | :ä | OK |
#tr | "ä".tr("a", "b") | "ä" | "b̈" | 注意してください! |
#unpack | "ä".unpack("CCC") | [97, 204, 136] | [97, 204, 136] | OK |
#upto | "ä".upto("c̈").to_a | ["ä", "b̈", "c̈"] | ["ä", "b̈", "c̈"] | OK |
#valid_encoding? | "ä".valid_encoding? | true | true | OK |
-
25 のベスト API テスト ツール
クラウド アプリと関連するプラットフォームの数が増えるにつれて、API テストはますます重要になっています。基本的に、API (アプリケーション プログラミング インターフェース) は、2 つのソフトウェア プログラムがやり取りしてデータを共有できるようにするメッセンジャーです。 .存在しないため、フロント エンドでは実行できない一種のソフトウェア テストです。この記事では、最高の無料 API テスト ツールをいくつか調べました。それでは、読み続けてください! 25 のベスト API テスト ツール API がソフトウェア開発の重要な側面になるにつれて、API テストはますます開発者と
-
17 の最高のモバイル テスト ツール
モバイル領域は急速に拡大しています。モバイル アプリケーションは、ビデオからモバイル バンキングまで、さまざまな形式で利用できるようになりました。莫大な収益性があるため、多くの企業がモバイル アプリ業界での存在感を確立しようとしています。アプリを作成するためのモバイル テストに最適なシミュレーターをお探しですか?見つけるお手伝いをいたします。この投稿では、Android と iOS のテスト範囲、効率、精度を向上させるのに役立つ最適なモバイル テスト ツールを見ていきます。 17 の最高のモバイル アプリ テスト ツール モバイル アプリの開発中に考慮すべきさまざまなプラットフォームと