cargo testで「no targets specified in the manifest」エラー

cargo testで「no targets specified in the manifest」エラーが出たときのメモ。

現象

作成していたファイル群。

Cargo.toml

[package]
name = "rust"
version = "0.1.0"
edition = "2021"

[dependencies]
borsh = "0.9.1"
borsh-derive = "0.9.1"

src/borsh.rs

use borsh::{BorshSerialize, BorshDeserialize};

#[derive(BorshSerialize, BorshDeserialize, PartialEq, Debug)]
struct A {
    x: u64,
    y: String,
}

#[test]
fn borsh_test_simple_struct() {
    let a = A {
        x: 3301,
        y: "liber primus".to_string(),
    };
    let encoded_a = a.try_to_vec().unwrap();
    let decoded_a = A::try_from_slice(&encoded_a).unwrap();
    assert_eq!(a, decoded_a);

    dbg!(a);
    dbg!(encoded_a);
    dbg!(decoded_a);
}

cargo testを実行するとエラーになる。

% cargo test -- --nocapture
error: failed to parse manifest at `/Users/user/solana-sample/src/rust/Cargo.toml`

Caused by:
  no targets specified in the manifest
  either src/lib.rs, src/main.rs, a [lib] section, or [[bin]] section must be present

原因

  • src/lib.rs または src/main.rs が存在していない。Rustがまずそこを読み込みに行くため。
  • もしくは、 Cargo.toml に [lib] セクション または [[bin]] セクションが存在していない

対策

(案1)lib.rsまたはmain.rsの作成

src/lib.rsまたはsrc/main.rsを作成し、そこにソースを記述する。一番手っ取り早い。

(案2)Cargo.tomlにlibまたはbinセクションを追記

以下を追記する。

[lib]
name = "borsh_sample"           # The name of the target.
path = "src/borsh.rs"    # The source file of the target.

この場合のターミナル実行は以下。

% cargo test -- --nocapture borsh_test_simple_struct

または

[[bin]]
name = "borsh_sample"
path = "src/borsh.rs"

この場合のターミナル実行は以下。なお、libのテスト指定方法はよくわからず。

% cargo test -- --nocapture

(参考)Cargo.tomlの追記イメージ

[package]
name = "rust"
version = "0.1.0"
edition = "2021"

[dependencies]
borsh = "0.9.1"
borsh-derive = "0.9.1"

[lib]
name = "borsh_sample"    # The name of the target.
path = "src/borsh.rs"    # The source file of the target.

libのnameはRustのライブラリ名とかぶらないように注意すること。