[過去ログ] Rust part16 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
815(1): 2022/09/25(日)21:09 ID:j1+dHWho(1/2) AAS
>>807
歴史があり、曖昧さが残るフォーマットの再実装はできればやりたくない仕事だな。
対応する仕様を現代で最低限必要なものを取捨選択して決め打ちで実装しつつ、考慮漏れでクリティカルなものは取り入れていく方式でやるしかないよ。
歴史あるフォーマットの曖昧な対応を追体験する作業は、不毛だからできれば既存実装におまかせすべき。
816(2): 2022/09/25(日)21:31 ID:Td47G6We(3/4) AAS
>>814
中間コンポーネントの単体テストって普通どうやるんだろ
後段のコンポーネントを切り離してテストするのか?繋げたままテストするのか?
切り離せるようにするとその部分にバグが入り込む余地が生まれるし
>>815
歴史が長いと仕様上○○であるがこれに準拠しないアプリやデータが少なからず存在するため
△△のような実装がベターだみたいなのが沢山あるからねぇ
そしてこの手の情報はググっても網羅するのが難しい
817: 2022/09/25(日)21:51 ID:6lgwXJxi(3/3) AAS
>>811
Linux側にメリットがないと言ってる?
818(1): 2022/09/25(日)21:51 ID:PDKGWlWe(1) AAS
>>816
> 中間コンポーネントの単体テストって普通どうやるんだろ
中間の意味がよく分からんけど>>813みたいな話なら関数A、関数A'をモックにしてテストする
たいていのテストツールではモックの呼び出し回数のテストができる
819(1): 2022/09/25(日)21:53 ID:j1+dHWho(2/2) AAS
>>816
JavaみたいにDIが発展しているタイプの言語だと中間コンポーネントが呼び出すコンポーネントはモックをインジェクトしてやって、適切なメソッドが呼び出されたかのテストとかよく書くね。
けど、正直Rustを含む他の言語で中間のレイヤだけ独立してテスト書くようなこだわりはあまり見たことも書いたこともないなぁ。
モジュール設計の考え方が変わるからかな?
820(2): 2022/09/25(日)22:41 ID:Td47G6We(4/4) AAS
今作っているのだとこんな感じかな?
関数C(データの前処理、処理単位への分割)
↓
関数B(処理全体の制御)→関数A'(処理1-2)
↓
関数A(処理1-1)
>>818,819
その場合モックへ切り替える機構はどうするんだろ
そのためにコードを書き換えていてはミスが入り込む可能性が高くなるし、条件付きコンパイルも同様のリスクがある
てかThe Rustのテストの所を見ても関数の呼び出し状況をテストする方法とかは書いていないんだよな
省1
821: 2022/09/26(月)00:07 ID:h/WE7ZWH(1/3) AAS
>>820
すまん rust だと cargo test で単体テストを実施するみたいだけど mook/stub をどうやって使うかはよくわからんかったわ
C++ とかだと googlemook とか使ってテスト用のモッククラスを作って入れ替えるかたちだね
822: 2022/09/26(月)00:33 ID:TCGzsvbI(1) AAS
mockall使うとか
823(1): 2022/09/26(月)06:28 ID:p/pWEmYs(1) AAS
cargo testで関数テスト、モジュールテスト、モジュール間テストなどあらゆるテストをやっているけどダメなの?
824: 2022/09/26(月)06:47 ID:h/WE7ZWH(2/3) AAS
>>823
>>820 > その場合モックへ切り替える機構はどうするんだろ
に答えてやってくれ
825: 2022/09/26(月)19:21 ID:kI3cAlPQ(1) AAS
モックやスタブは別モジュール化しておいて
mod tests内では本物モジュールをuseする代わりにそれをuseするだけじゃないの?
826: 2022/09/26(月)19:31 ID:V9yeC/LF(1/2) AAS
あと#[cfg(test)]でそれをuse
そして#[cfg(not(test))]で本物use
827(1): 2022/09/26(月)19:31 ID:i/jndsoD(1) AAS
他の言語でもユーティリティを使わずに、DIやモックを自分でやったことがないんだろうな
説明が面倒だ
828: 2022/09/26(月)19:38 ID:V9yeC/LF(2/2) AAS
>>827
テスト以外の開発の話でも
フレームワークに依存してやってる人は
単純なこと含めて本質的なことを理解してない人が多く
フレームワークなしでは何も分からず何も出来なくなってしまう例を時々見かける
829(2): 2022/09/26(月)21:10 ID:qW/k82Qg(1) AAS
cfg使えば良いじゃないって人は#ifまみれで一見しただけじゃ
何がどう動くんだか判らないCのコードを正当化するつもりなのだろうか
Rustは人間が注意すれば問題ないみたいな考えはレガシーで時代遅れだ
という思想の言語だと思っているんだが違うのかな
830: 2022/09/26(月)21:41 ID:w5YNQb64(1) AAS
>>829
#ifは使わないし
cfg(test)はテスト分離のため必須でしょ
どんな環境でも魔法は無いよ
831(1): 2022/09/26(月)23:33 ID:h/WE7ZWH(3/3) AAS
>>829
cfg使わないで済むいい方法があるなら書いてよ...
832: 2022/09/27(火)01:17 ID:OwORQ6vn(1/2) AAS
mod tests に cfg(test) は必要だとして
依存性の注入にはtrait使えって事なのでは
833: 2022/09/27(火)07:51 ID:f9SEu4pT(1) AAS
traitで置き換え可能にするのが面倒というのはありそうだな。
834(1): 2022/09/27(火)08:15 ID:SBVoZTui(1) AAS
AMD64のデフォルトのオペランドサイズは32bitなのにusizeが64bitなのは何でなのかな
835: 2022/09/27(火)11:05 ID:OwORQ6vn(2/2) AAS
size_tが64bitだからでは
836: はちみつ餃子 ◆8X2XSCHEME 2022/09/27(火)12:28 ID:ozjafOA0(1) AAS
>>834
usize はポインタのサイズということになっている。
837: 2022/09/27(火)19:04 ID:ZwmfNOl5(1) AAS
>>831
単体テストで、依存を分離するのは当然のことすぎてみんな説明が億劫になってる
C++だろうがRubyだろうが、モックやスタブを使って、関数同士やクラス同士の依存を切り分けてテストするのは当たり前
そうしないとそもそも単体テストにならないじゃん
わかってる人にしかわからないであろう簡略な説明をすると、テスト用のエントリポイントで、テストに使うモックオブジェクトを指定するだけだよ
そういうことができるようにあらかじめコード設計しておかないといけないがな
考えてなかったならリファクタが必要
838: 2022/09/27(火)19:48 ID:J8MleXan(1) AAS
そんなフワフワした説明されても...
839(1): 2022/09/27(火)19:51 ID:AWnlNGZp(1) AAS
本物と異なり決まった値を返す送信元スタブと
本物と異なりassertだけする送信先モックを
mod testsの中では本物の代わりにuseするだけだよね
入れ替えちゃうからtrait制約で本物も偽物も受け付け対応とかわざわざする必要ないよね
840: 2022/09/28(水)00:44 ID:JQpGo85s(1/2) AAS
>>839
useしたモックをどうやって注入すんの
関数の引数もstatic変数でも良いけど、テスト対象の実装がモックも本物も選択的に使えるようにするならば、
genericな型を受け付けるような実装にしておかないといけないのでtraitが登場するのでは
それともmod testsの外もcfgで置き換えると言っている?
841: 2022/09/28(水)00:48 ID:JQpGo85s(2/2) AAS
要は
use imp::Foo;
fn target(foo: Foo) {}
がテスト対象だとして
mod tests {
use mock::Foo;
#[test]
fn test() {
target(Foo::new());
}
省3
842(1): 2022/09/28(水)07:20 ID:1i04Jlqk(1) AAS
traitが無い言語では無理ってこと??
843: 2022/09/28(水)11:35 ID:RLf9Yg7w(1) AAS
>>842
他の言語は他のやり方でやってるだけだろ
844(1): 2022/09/29(木)01:43 ID:xXycU9Ev(1) AAS
u32 を格納する型が必要になり、また、逆に u32 に変換する必要もあるという状況で
せっかくだから u32 に変換可能な型は受け入れようと考えてこんなコードを書きました。
しかしエラーになります。
struct Code(u32);
impl<T: Into<u32>> From<T> for Code {
fn from(x: T) -> Self {
Code(x.into())
}
}
impl From<Code> for u32 {
省10
上下前次1-新書関写板覧索設栞歴
あと 158 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.024s